home *** CD-ROM | disk | FTP | other *** search
/ Technotools / Technotools (Chestnut CD-ROM)(1993).ISO / editors / tscredd2 / scrdisk5.exe / arc / TUTORPT3.DOC < prev   
Text File  |  1990-04-29  |  115KB  |  2,838 lines

  1.                                   Page I-11
  2.       
  3.        TURBO SCREDIT TUTOR PART III - Programming with Turbo ScrEdit.
  4.           Introduction to Turbo ScrEdit Tutor Part III.........T-3.1  
  5.           What you need before you get started.................T-3.1
  6.           A MINIMUM coding example.............................T-3.3
  7.           Programs generated by Turbo ScrEdit (G Menu Option)..T-3.5
  8.              Generating a source code file.....................T-3.6
  9.              Understanding the source code generated...........T-3.7
  10.              Compiling and running the generated programs......T-3.14
  11.           A look at ScrDemo.Exe................................T-3.15
  12.              Option 1 - A data entry example...................T-3.20
  13.                  S_ClearScreen and the SET command.............T-3.21
  14.                  S_EnterAsTab..................................T-3.24
  15.                  S_IsDupe, S_SetDupe, S_ClearDupes.............T-3.25
  16.                  Changing the value of a DUPE field............T-3.26
  17.                  Sound ON/OFF..................................T-3.27
  18.                  Auto Help ON/OFF..............................T-3.28
  19.                  Auto Validate ON/OFF..........................T-3.28
  20.                  Changing message line colors..................T-3.29
  21.              Option 2 - Demo of MOUSE functions................T-3.30
  22.                  S_MouseInstalled..............................T-3.30
  23.                  S_ActivateMouse...............................T-3.30
  24.                  S_SetMouseEvent...............................T-3.30
  25.                  S_SetMouseRange...............................T-3.31
  26.                  S_MsRow & S_MsCol.............................T-3.31
  27.                  S_ShowMouse...................................T-3.31
  28.                  S_ResetMouseFlags.............................T-3.32
  29.                  S_MouseEvent (S_Ms->MouseEvent for C).........T-3.32
  30.                  S_AnalizeMouse................................T-3.32
  31.                  S_HideMouse...................................T-3.38
  32.                  S_DisableMouse................................T-3.38
  33.              Option 3 - Customizing screen colors..............T-3.38     
  34.                  S_ChangeScreenColors..........................T-3.39
  35.                  S_ChangeFieldColors...........................T-3.40
  36.                  S_StoreColorChanges...........................T-3.41
  37.              Options 4 through 9...............................T-3.42
  38.       
  39.       
  40.       
  41.       
  42.       
  43.       
  44.       
  45.       
  46.       
  47.       
  48.       
  49.       
  50.       
  51.       
  52.       
  53.       
  54.       
  55.       
  56.       
  57.       
  58.       
  59.       
  60.       
  61.       
  62.       
  63.       
  64.       
  65.       
  66.       
  67.                                  Page T-3.1
  68.       
  69.                          **  Turbo ScrEdit Tutor  **
  70.                       Copyright(C) 1989, by iHn Systems       
  71.       
  72.       
  73.       
  74.       Introduction to Turbo ScrEdit Tutor Part III
  75.       -----------------------------------------------------------------
  76.       In PART ONE you learned  how to create a screen file, create  and 
  77.       edit  screens,   compile  a screen,  change the  order  that  the 
  78.       screens  fields  are processed,  change the  field's display  and  
  79.       prompt color assignments, test a screen, and finally, how to tell 
  80.       scredit to create the source code needed to use the screen file.
  81.       
  82.       In  PART  TWO  you  learned how  to  use  Turbo  ScrEdit's  field 
  83.       processing language, and how use the screen test facilities.
  84.       
  85.       In  PART  THREE we are going get acquainted with some programming 
  86.       examples  that demonstrate how to write programs that  take  full 
  87.       advantage of all Turbo Scredit's screen handling and data editing 
  88.       features.  We will look at some example programs that range  from 
  89.       very  simple  to very complex. These   programming  examples  use 
  90.       Turbo  ScrEdit  screens, mouse procedures. We will  also  take  a 
  91.       closer  look  at some  of  the ways that you  can  use  ScrEdit's 
  92.       field  processing  language  to edit values   keyed  into  screen 
  93.       fields, set initial values, and use edit masks.
  94.       
  95.       Forgive me if explain things that seem pretty basic to you. Or if 
  96.       I talk to you as though you don't know a lot about programming in 
  97.       your  language.  I  have found that many  people  ordering  Turbo 
  98.       ScrEdit say that they are just getting started with  programming. 
  99.       The approach I am taking here is for their benefit. If you are  a 
  100.       seasoned programmer feel free to skip over what you don't need. 
  101.       
  102.       
  103.       What you need to before we get started.
  104.       ----------------------------------------------------------------- 
  105.       Before  we get started you must have already created  the  "unit" 
  106.       files or the C "object code library" files as described on  pages 
  107.       4,  5,  and 6 of the "Turbo ScrEdit Reference Manual".  You  will 
  108.       also need to have the following source code files available to be 
  109.       edited, compiled, and run.
  110.       
  111.            Files need for this part of the tutor.
  112.            ------------------------------------------------------------
  113.            Smallest.Pas or Smallest.C
  114.                            Smallest.Prj
  115.            ScrDemo.Pas  or ScrDemo.C
  116.                            ScrDemo.Prj
  117.            ScrDemo.Scr
  118.            DemoWind.Exe
  119.       
  120.            Preparing the screens to be used.
  121.            ------------------------------------------------------------
  122.            Before we can begin compiling and running the  demonstration 
  123.            programs we will need to use the Turbo ScrEdit Screen Editor 
  124.            to compile the screens in the screen file "ScrDemo.Scr".
  125.       
  126.            LOAD AND RUN TSCREDIT
  127.       
  128.       
  129.       
  130.       
  131.       
  132.       
  133.                                  Page T-3.2
  134.       
  135.       
  136.       
  137.       
  138.            PRESS F1 AND TYPE "SCRDEMO"
  139.       
  140.            Once  you  have loaded the file "ScrDemo" you will  want  to 
  141.            compile each screen in the file using the F4 menu option. 
  142.       
  143.            PRESS F4 ON THE FIRST SCREEN "DEMO_MENU".
  144.       
  145.            SELECT  THE  OPTION  FOR  YOUR COMPILER  AND  PRESS  "Y'  TO 
  146.            CONTINUE.
  147.       
  148.            PRESS ESC 
  149.       
  150.            Now  we should be back to the main menu. Turbo  ScrEdit  has 
  151.            just created the screen record definitions for "Demo_Menu".
  152.       
  153.            PRESS HOME to scroll to the next screen "Demo_Screen".
  154.       
  155.            PRESS  F4  again  to compile this  screen  and  repeat  this 
  156.            process  until  you have compiled all the  screens  in  this 
  157.            screen file.   
  158.             
  159.            When you are finished compiling all the screens in the file, 
  160.            press the ESC key to exit back to DOS.
  161.       
  162.         
  163.       
  164.       
  165.       
  166.       
  167.       
  168.       
  169.       
  170.       
  171.       
  172.       
  173.       
  174.       
  175.       
  176.       
  177.       
  178.       
  179.       
  180.       
  181.       
  182.       
  183.       
  184.       
  185.       
  186.       
  187.       
  188.       
  189.       
  190.       
  191.       
  192.       
  193.       
  194.       
  195.       
  196.       
  197.       
  198.       
  199.                                  Page T-3.3
  200.       
  201.       
  202.       Minimum coding example
  203.       -----------------------------------------------------------------
  204.       The  source  files  "Smallest.Pas"  and  "Smallest.C"  have  been 
  205.       included in your Turbo ScrEdit package. We are going to begin  by 
  206.       looking at just how little effort it takes to get a screen up and 
  207.       running.  Normally  you would create a screen of  your  own  that 
  208.       pertains  to the application that you intend to develop, but  for 
  209.       this  example we are going to use a screen that is stored in  the 
  210.       screen file "ScrDemo.Scr."
  211.       
  212.       Load and run your Turbo Language programming environment.
  213.       
  214.       Load one of the files "Smallest.Pas" or "Smallest.C" depending on 
  215.       the language that you are using. 
  216.       
  217.       You should now be in your program editor. The entire "Smallest.?" 
  218.       source file should be visible on your screen. Lets take a line by 
  219.       line look at this little program.
  220.       
  221.       
  222.              Pascal                         C
  223.              -----------------------------  ---------------------------
  224.       =1>    Uses ScrEdit;                  #include "ScrEdit.H"
  225.       =2>    {$I YourFile.001}              #include "YourFile.001"
  226.       =3>                                   void main()
  227.       =4>    Begin                          {
  228.       =5>                                   S_Init();
  229.       =6>    S_OpenScreenFile('ScrDemo);    S_OpenScreenFile("ScrDemo");
  230.       =7>    Initialize_Dupe_Demo_Buf;      Initialize_Dupe_Fields_buf;  
  231.       =8>    S_LoadScreen('Dupe_Fields');   S_LoadScreen("Dupe_Fields");
  232.       =9>    Repeat                         do{
  233.       =10>     S_ReadScreen;                  S_ReadScreen();
  234.       =11>     If S_Enter Then                if (S_Enter)
  235.       =12>        S_UserMsg :=                   strcpy(S_UserMsg,
  236.                     ' PROCESS SCREEN ';             " PROCESS SCREEN ");
  237.       =13>                                    }
  238.       =14>   Until S_Esc;                   while (!S_Esc);
  239.       =15>   S_CloseScreenFile;             S_CloseScreenFile();
  240.       =16>   End.                           }  
  241.              ------------------------------ ---------------------------
  242.       
  243.       =1>    The first statement includes the unit files or the  object 
  244.              code  library  headers  that  contain  the  Turbo  ScrEdit 
  245.              procedures prototypes.
  246.       
  247.       =2>    This  include  statement  will  copy  the  screen   buffer 
  248.              definitions   for  "ScrDemo.004"   or  the  screen   named 
  249.              "Dupe_Fields" into the program. This will be the screen we 
  250.              will experiment with first.
  251.       
  252.       =3>    Statement number 3 defines "MAIN" and is required by C.
  253.       
  254.       =4>    Begin the procedure.
  255.       
  256.       =5>    Turbo  Pascal is self initializing, but Turbo  C  requires 
  257.              that you perform a call to S_Init to initialize the  Turbo 
  258.              ScrEdit interface module. ** DON'T ** forget to make  this 
  259.              call  as one of the first things done in your program.  If 
  260.       
  261.       
  262.       
  263.       
  264.       
  265.                                  Page T-3.4
  266.       
  267.       
  268.       
  269.              you  call a Turbo ScrEdit procedure  before  initializing, 
  270.              your computer will most likely lock up when Turbo  ScrEdit 
  271.              starts  loading values into memory addressed  by  pointers 
  272.              that have not been initialized.
  273.       
  274.       =6>    Next we will open the screen file "ScrDemo" and prepare it 
  275.              to be used by our program.  
  276.       
  277.       =7>    Now  that the screen file is open we can load  the  screen 
  278.              and display it to the video screen.
  279.       
  280.       =8>    Next a loop begins.
  281.        
  282.       =9>    A  call  is made to S_ReadScreen. Turbo ScrEdit  will  now 
  283.              accept data into the screen that has been displayed  until 
  284.              the ENTER key or some other special key is pressed.
  285.       
  286.       =10>   When  the  one of the special keys  are  pressed,  control 
  287.              returns  to  this point in the program. At this  point  we 
  288.              could  check  for  any key that has been  press.  In  this 
  289.              example  I  am checking to see if the enter key  has  been 
  290.              pressed.
  291.       
  292.       =11>   If  the Enter key has been pressed
  293.       
  294.       =12>   the  message  "  PROCESS SCREEN " is  moved  to  the  user 
  295.              definable  message variable. The next time a call is  made 
  296.              to  S_ReadScreen, S_ReadField, or S_ReadKey,  the  message 
  297.              will be displayed. 
  298.       
  299.       =13>   C specific end of  do/while statements.
  300.       
  301.       =14>   We  see that the loop is to be repeated until the user  of 
  302.              the program presses the ESC key.
  303.         
  304.       =15>   When  the  user presses the ESC key, the  screen  file  is 
  305.              closed.
  306.       
  307.       =16>   Execution ends.
  308.       
  309.       
  310.       MAKE SURE THAT THIS PROGRAM COMPILES SUCCESSFULLY AND RUNS BEFORE 
  311.       YOU CONTINUE WITH THIS TUTOR. 
  312.       
  313.       Turbo Pascal:
  314.           This  program  should compile and run if you  have  done  the 
  315.           following:
  316.              1 - You  have  created the "unit" files mentioned  in  the  
  317.                  introduction and moved them to your unit directory.
  318.              2 - Set OPTION/LINKER/LINK BUFFER to DISK
  319.              3 - Set OPTION/DIRECTORIES/UNIT   to the  disk  directory 
  320.                  where  you have stored "Scredit.Tpu",  "ScrMouse.Tpu", 
  321.                  "Windows.Tpu".
  322.              4 - Set COMPILE/DESTINATION to DISK
  323.              5 - Set COMPILE/PRIMARY FILE to "Smallest.Pas"
  324.         With  these setting you should be able to compile  and  execute 
  325.         this program.
  326.       
  327.       
  328.       
  329.       
  330.       
  331.                                  Page T-3.5
  332.       
  333.       
  334.       
  335.       Turbo C:
  336.          This  program  should  compile and run if you  have  done  the 
  337.          following:  
  338.             1 - Edit  the project file Smallest.Prj and add the  drive, 
  339.                 path  and  library  name that you will  be  using.  The 
  340.                 project  file is set up to use the MEDIUM memory  model 
  341.                 so  change it to use the memory model of  your  choice: 
  342.                 (MEDIUM) screditM.lib, (COMPACT) screditC.lib,  (LARGE) 
  343.                 screditL.lib, or (HUGE) screditH.lib.
  344.                 The current project file reads:
  345.                     smallest screditm.lib
  346.                 You might change it to:
  347.                     smallest C:\TC\screditM.Lib  
  348.             2 - Set PROJECT/PROJECT NAME to "scrdemo.prj"
  349.             3 - Set OPTION/COMPILER/MODEL to the same memory model  you 
  350.                 selected the library for in the project file. 
  351.             4 - Set COMPILE/PRIMARY C FILE: to "smallest". 
  352.          
  353.         With  these setting you should be able to compile and run  this 
  354.         example program.
  355.                     
  356.       
  357.       
  358.       
  359.       
  360.       The purpose of this example was to show you how little coding  is 
  361.       required  to access a screen file and display a screen.  We  will 
  362.       take a closer look at how this screen is used when we look at the 
  363.       demo program ScrDemo.
  364.       
  365.       When  you are finished experimenting with this program exit  back 
  366.       to  DOS  and  resume with the next section  of  this  tutor  that 
  367.       describes source files generated by Turbo ScrEdit.
  368.       
  369.       
  370.       
  371.       Programs Generated by Turbo ScrEdit
  372.       -----------------------------------------------------------------
  373.       Next  we  will take a look the program that Turbo  ScrEdit  would 
  374.       generate for you to handle the screens in the ScrDemo.Scr  screen 
  375.       file.
  376.       
  377.       As  we begin this section of the tutor, you should be at the  DOS 
  378.       prompt.   
  379.       
  380.       It is important to understand that when Turbo ScrEdit generates a 
  381.       source  file it always names it the same name as the screen  file 
  382.       that  the  screens are stored in with a extension of  '.Pas'  for 
  383.       Pascal source code or ".C" for C source code. 
  384.       
  385.       Next we are going to use Turbo ScrEdit's main menu "G" option  to 
  386.       generate  a program source file that will access all the  screens 
  387.       stored in the screen file "ScrDemo.Scr". 
  388.       
  389.       Turbo "C" users - since we are going to generate a skeleton  file 
  390.                         for the screens in "ScrDemo.Scr" you will  need 
  391.       
  392.       
  393.       
  394.       
  395.       
  396.       
  397.                                  Page T-3.6
  398.       
  399.       
  400.       
  401.                         to    rename    the   file    "SCRDEMO.C"    to 
  402.                         "SCRDEMO.OLD".  Otherwise, Turbo  ScrEdit  will 
  403.                         overlay our other demonstration program's source 
  404.                         code  with  the  code  that  we  are  about  to 
  405.                         generate.
  406.       
  407.       
  408.       We are ready to begin.
  409.       
  410.       Generating a source code file.
  411.       -----------------------------------------------------------------
  412.       Run Turbo ScrEdit and load the screen file "ScrDemo" as the  work 
  413.       file.
  414.       
  415.       PRESS "G"
  416.       
  417.       SELECT THE COMPILER THAT YOU ARE USING.
  418.       
  419.       PRESS TAB
  420.       
  421.       PRESS "N"  So  all  comments will not be supressed  durring  code 
  422.                  generation,  but will be included in the  source  file        
  423.                  generated.
  424.       
  425.       PRESS "N"  We  want  the screen buffer files to  be  included  at 
  426.                  compiler time for this example.
  427.       
  428.       PRESS "M"  We  will  use  mixed upper and  lower  case  for  this 
  429.                  example.
  430.       
  431.       Next  we  must  tell Turbo ScrEdit where  the  skeleton  file  is 
  432.       located  that  is used to generate source code.  If  the  default 
  433.       directory displayed is not correct then correct it by typing in a 
  434.       new drive and path.
  435.       
  436.       Next we must tell Turbo ScrEdit which screens we want the program 
  437.       that  is  going to be generated to be able to access.   You  will 
  438.       notice  that  a  light  bar  is  highlighting  the  screen   name 
  439.       "Demo_Screen".
  440.       
  441.       PRESS  DOWN ARROW A COUPLE OF TIMES.
  442.       
  443.       The  light  bar  moves down a name each time the  down  arrow  is 
  444.       pressed. 
  445.       
  446.       PRESS THE UP ARROW AND MOVE THE LIGHT BAR BACK TO THE TOP NAME IN 
  447.       THE WINDOW.
  448.       
  449.       PRESS THE HOME KEY.
  450.       
  451.       The HOME key places a marker next to the screen name. This marker 
  452.       means  that  the  screen to the left of it will  be  one  of  the 
  453.       screens  that the new program will access. Notice that the  light 
  454.       bar has moved to the next screen name.
  455.       
  456.       PRESS UP ARROW 
  457.       
  458.       
  459.       
  460.       
  461.       
  462.       
  463.                                  Page T-3.7
  464.       
  465.       
  466.       
  467.       PRESS THE END KEY.
  468.       
  469.       The  marker  is removed and the light bar has moved to  the  next 
  470.       screen name.
  471.       
  472.       PRESS THE HOME KEY ON EACH OF THE SCREEN NAMES IN THE WINDOW.
  473.       
  474.       For  the purpose of this example we want all the screens in  this 
  475.       screen file to be marked.
  476.       
  477.       PRESS ENTER.
  478.       
  479.       A  message "** GENERATING SOURCE CODE **" appears on the  message 
  480.       line as Turbo ScrEdit generates the new program file. If you  are 
  481.       using  "C"  and  you  did  not  rename  the  file  ScrDemo.C   to 
  482.       ScrDemo.Old, you will get warning that Turbo ScrEdit is going  to 
  483.       overlay the original source file with the new one it is about  to 
  484.       generate.
  485.       
  486.       When  the  message disappears Turbo ScrEdit will return  to  the 
  487.       main menu.
  488.       
  489.       PRESS ESC to exit Turbo ScrEdit.
  490.       
  491.       Print a copy of the program that was just generated,  "ScrDemo.C" 
  492.       or  "ScrDemo.Pas",   and a copy of "Skeleton.C"  or  "Skeleton.P" 
  493.       depending  of which compiler you are using. We will  examine  the 
  494.       skeleton  file  and what Turbo ScrEdit added to it when  the  new 
  495.       program file was generated.
  496.       
  497.       
  498.       A look at a program file generated by Turbo ScrEdit.
  499.       ----------------------------------------------------------------
  500.       As  you  begin  this section of the tutor, you  should  have:
  501.       
  502.           1 - The  source file that we just generated,  "ScrDemo.C"  or 
  503.               "ScrDemo.Pas"  loaded into your programming editor,  with 
  504.               the first few lines of code visible on the video. 
  505.       
  506.           2 - The printed listing of the skeleton file "Skeleton.C"  or 
  507.               "Skeleton.Pas".
  508.       
  509.       The program file that Turbo ScrEdit generates is intended to be a 
  510.       launching platform for your new applications. 
  511.       
  512.       The  discussion  that follows will help you  understand  the  way 
  513.       Turbo  ScrEdit  uses the skeleton file. The source code  in  this 
  514.       file  has  been divided into sections with labels  surrounded  by 
  515.       "**".  In the text that follows I will describe the code that  is 
  516.       inserted by Turbo ScrEdit following each of these labels. As  you 
  517.       read the  descriptions  that  follow, locate each  label  in  the 
  518.       skeleton  file  listing.  Then  locate  the  same  label  in  the 
  519.       program  you have loaded into you text editor and see what  Turbo 
  520.       ScrEdit has inserted in the text.
  521.       
  522.       
  523.       
  524.       
  525.       
  526.       
  527.       
  528.       
  529.                                  Page T-3.8
  530.       
  531.       
  532.       
  533.       You  may  modify the original skeleton file if you wish.  DO  NOT 
  534.       change any line that has words surrounded by "**". Turbo  ScrEdit 
  535.       Locates these key words and inserts the code needed for processing 
  536.       the   particular screen file. You may change  anything else  that 
  537.       you  wish.  If you remove any of the text markers used  by  Turbo 
  538.       ScrEdit it will not insert the code that it otherwise would  into 
  539.       the file. 
  540.       
  541.       Locate "**Version**". It is the fist key word in the file.
  542.       
  543.          Pascal
  544.          --------------------------------------------------------------   
  545.          Turbo ScrEdit has added a "USES" statement here. 
  546.       
  547.          For C:
  548.          --------------------------------------------------------------   
  549.          Turbo  ScrEdit has added a #include statement here  that  will 
  550.          copy in the Turbo ScrEdit header file "ScrEdit.H". 
  551.       
  552.       
  553.       Locate "**Buffers**". 
  554.       
  555.          When you compile a screen using the "F4" option from the Turbo 
  556.          ScrEdit  main menu, a small file is created that contains  the 
  557.          record definition for the screen and the screen initialization 
  558.          procedure.
  559.       
  560.          This   is  where  these  screen  buffers  and   initialization 
  561.          procedures will be placed in the program. Turbo ScrEdit allows 
  562.          you to select whether the buffer modules are to be copied into 
  563.          the code at this point or included at compile time by using $I 
  564.          or #include statements.
  565.           
  566.          We  see that Turbo ScrEdit has inserted five of these  include 
  567.          statements into the "ScrDemo" source  file.
  568.       
  569.       
  570.       Locate "**User Variables**"
  571.       
  572.          ScrEdit  will  not  place any additional code  here.  You  may 
  573.          define   your  program's  global  variables   and   procedures 
  574.          beginning here.
  575.           
  576.       
  577.       Locate "** Example of loading and displaying screens **"
  578.          
  579.          This section of code is used only for switching from screen to 
  580.          screen when the F1 key is pressed.
  581.       
  582.          You  may convert this into a working  procedure  for  your 
  583.          programs by changing the procedure to read:
  584.       
  585.       
  586.       
  587.       
  588.       
  589.       
  590.       
  591.       
  592.       
  593.       
  594.       
  595.                                  Page T-3.9
  596.       
  597.       
  598.       
  599.          For Pascal:
  600.       
  601.             Procedure Load_Screen;
  602.             Begin
  603.             Case S_Num of
  604.       
  605.               Don't change anything between Case and End;
  606.       
  607.               End;
  608.             End;
  609.       
  610.       
  611.         For C:
  612.       
  613.             void Load_Screen();
  614.             {
  615.             switch (S_Num)
  616.               {
  617.       
  618.               Don't change anything between switch and };
  619.          
  620.               }
  621.             }
  622.       
  623.          If  you  make this change you can load a screen  by  assigning 
  624.          "S_Num" one of the screen numbers from the case statement that 
  625.          corresponds to the screen name that you want loaded. Be  aware 
  626.          that  Turbo  ScrEdit  will change the value of  S_Num  to  the 
  627.          actual screen number as it appears in the screen file index.
  628.       
  629.          **  NOTE ** the field S_Num is defined in ScrEdit.pas. All  of 
  630.          the  fields that have been defined for use with Turbo  ScrEdit 
  631.          procedures  start with "S_". Try not to  use the  "S_"  naming 
  632.          convention  for  your  programs  variables  to  avoid   having 
  633.          conflicts with Turbo Scredit.
  634.       
  635.       
  636.       Locate "**ScreenFileName**"
  637.       
  638.          Turbo  ScrEdit places the statement here that will   open  the 
  639.          screen file.
  640.       
  641.          Turbo C 
  642.          --------------------------------------------------------------   
  643.          An  important thing to know about this call is that  it  turns 
  644.          the  system  cursor off. If the program  ends  abnormally  the 
  645.          cursor may be left off. To insure that the cursor is not  left 
  646.          off, always call S_CloseScreenFile at the end of your program.
  647.          Cursor.exe  has be included in the Turbo ScrEdit  package  and 
  648.          can be ran to restore the system cursor.
  649.       
  650.          Turbo Pascal
  651.          --------------------------------------------------------------
  652.          Turbo ScrEdit handles abnormal ends for pascal.
  653.       
  654.         
  655.       
  656.       
  657.       
  658.       
  659.       
  660.       
  661.                                  Page T-3.10
  662.       
  663.       
  664.       
  665.       Locate "**InitRoutines**"
  666.          
  667.          Turbo   ScrEdit   will  insert  calls  to   all   the   screen 
  668.          initialization procedure here for each of the screens selected 
  669.          to be accessed by this source file.
  670.       
  671.          After   the   screen  file  is  opened   the   screen   buffer 
  672.          initialization  procedures must be performed. There will be  a 
  673.          procedure  for each of the screens that were selected  in  the 
  674.          screen file when the source code was generated.
  675.       
  676.          **  IMPORTANT  NOTE ** if for some reason  the  initialization 
  677.          procedures  are not performed, your program will  malfunction. 
  678.          Data  will  not be moved to and from the screen  properly.  In 
  679.          some  cases your program will hang the system because data  is 
  680.          being move to memory locations addressed by pointers that have 
  681.          incorrect  values.  IN MOST CASES IF YOU HAVE  PROBLEMS  USING 
  682.          TURBO SCREDIT THIS WILL BE THE CAUSE.
  683.       
  684.       
  685.       Locate "**System Switches**"
  686.       
  687.          This is where the global variables are being assigned  values. 
  688.          Each of the fields listed here are assigned default values  by 
  689.          Turbo  ScrEdit when it is initialized. They are included  here 
  690.          to help you understand that you can change these fields values 
  691.          to  customize  these  features.  You  will  find  a   complete 
  692.          description  of  each  of  these  fields  in  the  programmers 
  693.          reference manual.
  694.       
  695.          Any values that you may assign here will override the  default 
  696.          values.
  697.       
  698.          Look  up each of these variables in the programmers  reference 
  699.          manual  for  a  description of there function.  Also  you  may 
  700.          experiment  by changing them and recompiling this program  and 
  701.          running it. 
  702.       
  703.       Locate * 1st Example Code *
  704.       
  705.         This  code  initializes the pointers used to control  the  next 
  706.         screen to be  loaded by the demonstration part of this program. 
  707.         You  will  want to delete these lines when you build  your  own 
  708.         program.
  709.       
  710.         The  variable Demo_Mode is set to 1 by default to use the  full 
  711.         screen read mode. See the description of "Demo Mode 1".
  712.       
  713.         Changing  Demo_Mode to 2 will change the way that  the  program 
  714.         reads  the  screen fields from full screen mode  to  individual 
  715.         field mode. See the description of "Demo Mode 2".
  716.       
  717.       
  718.       There  are  four  methods supported by Turbo ScrEdit  to  process 
  719.       your screens.
  720.         S_READKEY    - returns a single key stroke in S_Ch and/or  sets 
  721.                        key flags.
  722.       
  723.       
  724.       
  725.       
  726.       
  727.                                  Page T-3.11
  728.       
  729.       
  730.       
  731.         S_READFIELD  - reads data into one field on the screen and sets 
  732.                        key flags.
  733.         S_READSCREEN - reads  data into all the data entry fields on  a 
  734.                        screen and sets key flags.
  735.         S_NEXTKEY    - same  as  S_READKEY only no  user  messages  are  
  736.                        displayed on the bottom line of the display.  In 
  737.                        fact   user  message  are  discarded   by   this  
  738.                        procedure.
  739.       
  740.       
  741.       Locate "** Demo mode 1 - Full Screen Modes **"
  742.       -----------------------------------------------------------------
  743.         The  "IF" statement here is only needed to make the example  of 
  744.         using S_READSCREEN work for demonstration mode 1. If you decide 
  745.         to  use the full screen mode in your  working program the  code 
  746.         will look like this:
  747.       
  748.         For Pascal:
  749.       
  750.             S_READSCREEN;
  751.       
  752.         For C:
  753.       
  754.             S_ReadScreen();
  755.       
  756.         When you call S_READSCREEN a number of things happen.
  757.       
  758.         - Any  values  that  have been moved to fields  in  the  screen 
  759.           record are displayed on the screen. (See the examples in  the 
  760.           discussion on using "ScrDemo" that follows for more details.)
  761.       
  762.         - If  the field "S_UserMsg" has been assigned a message  it  is 
  763.           displayed on the bottom line of the screen.
  764.       
  765.         - If  S_Point  has been assigned a screen  field  number,  data 
  766.           entry will begin on the specified field. If S_Point is set to 
  767.           a  display only field or a non-existent field, Turbo  ScrEdit 
  768.           will advance to the next data entry field on the screen.
  769.       
  770.           If  the screen has no  fields Turbo ScrEdit  calls  S_READKEY 
  771.           and  will return when the next key is pressed. The  value  of 
  772.           the key pressed is returned in the character field S_Ch.
  773.       
  774.           If  the  screen has only "display only" fields  on  it  Turbo 
  775.           ScrEdit  will call S_READKEY and return when the next key  is 
  776.           pressed.
  777.       
  778.           If the screen has data entry fields on it, Turbo ScrEdit will 
  779.           accept  data  into the fields until a  special  keystroke  is 
  780.           detected. See "* special key testing *" for more info on what 
  781.           special keys are.
  782.       
  783.         - When  the ENTER key is pressed the entire screen is  returned 
  784.           to  your  program. Any field validation  specifications  that 
  785.           have  been  defined  for the fields on the  screen  are  only 
  786.           considered when ENTER is pressed.
  787.       
  788.       
  789.       
  790.       
  791.       
  792.       
  793.                                  Page T-3.12
  794.       
  795.       
  796.       
  797.       Locate "** Demo Mode 2 **"
  798.       -----------------------------------------------------------------
  799.         This  code  is intended to illustrate how to process  a  screen 
  800.         reading  a single field at a time. When your program  needs  to 
  801.         have control between each field that the user keys you can  use 
  802.         this  method. Most of what you see in this code can be  removed 
  803.         when you use it in a program. The Code that you would use  will 
  804.         look like this:
  805.       
  806.         For Pascal:
  807.       
  808.              S_Point := field number;
  809.       
  810.              S_READFIELD;
  811.       
  812.         For C:
  813.       
  814.              S_Point = field number;
  815.       
  816.              S_ReadField();
  817.       
  818.       
  819.         The  field number that S_POINT is assigned can be found on  the 
  820.         screen  listing that is produced using the F5 option  of  Turbo 
  821.         ScrEdit's main menu. If you don't have a printer you can number 
  822.         the  fields with paper and pencil. Fields are numbered as  they 
  823.         occur  on the screen left to right and top to bottom  beginning 
  824.         with 1 in pascal and 0 in C.
  825.       
  826.         When you call S_READFIELD a number of things happen.
  827.       
  828.         -  If  you  have set S_POINT to a non-existent  field,  a  dupe 
  829.            field,  or  a display only field an error  message  will  be 
  830.            displayed. Remember when you use this method of processing a 
  831.            screen you are taking responsibility to direct Turbo ScrEdit 
  832.            to the field that you want used.
  833.       
  834.         - Any  values  that  have been moved to fields  in  the  screen 
  835.           record are displayed on the screen.
  836.       
  837.         - If  the  field S_UserMsg has been assigned a  message  it  is 
  838.           displayed on the bottom line of the screen.
  839.       
  840.         - Turbo  ScrEdit then prompts the user to enter data  into  the 
  841.           field. 
  842.       
  843.       Turbo  ScrEdit will continue to accept keystrokes into the  field 
  844.       until one of the following occurs:
  845.       
  846.         1 - Any  of  the  special keys are  pressed.  See  the  section 
  847.             labeled  "*  special key testing *" for more info  on  what 
  848.             special keys are.
  849.       
  850.         2 - The Field is filled with keystrokes.
  851.       
  852.         3 - The Left or Right arrows are used to move the cursor out of 
  853.             the field at either the left or right side.
  854.       
  855.         4 - The ENTER key is pressed.
  856.       
  857.       
  858.       
  859.                                  Page T-3.13
  860.       
  861.       
  862.       
  863.         The  field validation statements that are assigned to  a  field 
  864.         will  only  be  used  to test the  contents  of  a  field  when 
  865.         conditions 2, 3, or 4 occur.
  866.       
  867.         *** IMPORTANT NOTE ***
  868.       
  869.         Remember  that  when the special keys are pressed,  data  entry 
  870.         ends, Turbo ScrEdit DOES NOT perform field validation,  control 
  871.         returns  immediately  to  your  program.  Don't  use  the  data 
  872.         returned  in the field unless your screen does not  have  field 
  873.         validation  statements assigned to the fields, or your  program 
  874.         verifies  that  the data is valid. 
  875.       
  876.       
  877.       Locate "** Example code for demonstration mode **"
  878.       
  879.         This code can be deleted and is only used to demonstrate  using 
  880.         S_READKEY and providing a generic way of switching screens.
  881.       
  882.         In most cases you will use S_READKEY to prompt your user for  a 
  883.         response. You could do something like this:
  884.       
  885.         Pascal:
  886.       
  887.            Repeat
  888.                S_UserMsg := 'Delete this record Y/N';
  889.                S_ReadKey;
  890.            Until UpCase(S_Ch) In['Y','N'];
  891.       
  892.         C:
  893.       
  894.            do{
  895.              strcpy(S_UserMsg,"Delete this record Y/N");
  896.              S_ReadKey();
  897.            }while ((!toupper(S_Ch)=='Y')||(!toupper(S_Ch)=='N'));
  898.       
  899.         In this example several things happen:
  900.       
  901.         - The contents of the screen record are moved to the screen.
  902.       
  903.         - The message assigned to S_UserMsg is displayed on the  bottom 
  904.           line  of the screen.
  905.       
  906.         - Turbo ScrEdit waits until a key is pressed, and then  returns 
  907.           the keystroke in S_CH.
  908.       
  909.         This example will continue prompting and displaying the message 
  910.         until either "Y" or "N" is pressed.
  911.       
  912.         S_READKEY does not have any connection with screen fields,  the 
  913.         key  pressed is returned to your program but not  displayed  on 
  914.         the screen.
  915.       
  916.       
  917.       
  918.       
  919.       
  920.       
  921.       
  922.       
  923.       
  924.       
  925.                                  Page T-3.14
  926.       
  927.       
  928.       
  929.       Locate "** Special Key Testing **"
  930.       
  931.         This  code  demonstrates  the entire spectrum  of  special  key 
  932.         strokes and combinations of key strokes that you can test  for. 
  933.         The  best way to understand this code is to try each  condition 
  934.         when you compile and run this program.
  935.       
  936.       
  937.       Locate * Closing the screen file **"
  938.       
  939.         Turbo C users: 
  940.             If  your program ends without closing the screen  file  the 
  941.             system cursor will be left off.
  942.       
  943.         Pascal users:
  944.             The  Pascal  version of the Turbo  ScrEdit  interface  will 
  945.             automatically  do  the  house keeping  for  you  when  your 
  946.             programs ends normally or abnormally.
  947.       
  948.       That concludes our look at a source code file generated by  Turbo 
  949.       ScrEdit's main menu "G" option.
  950.       
  951.       
  952.       Compiling and running the generated programs.
  953.       -----------------------------------------------------------------
  954.       Then  next step is to compile and run the program and see how  it 
  955.       actually works. 
  956.       
  957.       Turbo Pascal
  958.       -----------------------------------------------------------------
  959.           Before  you try to compile and run this program be sure  that 
  960.           the OPTION/DIRECTORY/UNITS search paths include the directory 
  961.           where you have stored "ScrEdit.Tpu".
  962.        
  963.           Also  be  sure  that  "ScrEdit.Pas" is  not  in  the  current 
  964.           director with the "ScrDemo" source files.
  965.       
  966.           You may now compile and run the program.
  967.       
  968.       
  969.       Turbo C
  970.       -----------------------------------------------------------------
  971.           Modify  the  project file "ScrDemo.Prj" so the  compiler  can 
  972.           locate the Turbo ScrEdit Interface library file "ScrEdit.Lib".
  973.       
  974.           The file now reads:
  975.       
  976.               scrdemo
  977.               scrdemol.lib
  978.       
  979.           You might modify it to read like:
  980.       
  981.               scrdemo
  982.               C:\TC\LIBS\scrdemol.lib
  983.       
  984.           Next  set the OPTIONS/COMPILER/MODEL to LARGE. (You  can  use 
  985.           any  model  that you wish, MEDIUM, COMPACT, LARGE,  or  HUGE.
  986.       
  987.       
  988.       
  989.       
  990.       
  991.                                  Page T-3.15
  992.       
  993.       
  994.       
  995.           Just  be sure that it is the model that matches  the  library 
  996.           type specified in the project files "ScrDemo.Prj". 
  997.       
  998.           Next set PROJECT/PROJECT NAME to "SCRDEMO.PRJ"
  999.       
  1000.           Next set COMPILE/PRIMARY C FILE to "ScrDemo.C".
  1001.        
  1002.       You may now compiler and run the example program.
  1003.       
  1004.       If the program fails to compile review the instructions for  your 
  1005.       particular  language and check each setting. If everything  looks 
  1006.       ok  then  go back and try compiling  the  "Smallest.Exe"  program 
  1007.       again.  If  "Smallest.Exe" compiles  successfully,  then  ScrDemo 
  1008.       should  also compile. If "Smallest.Exe" will not compile and  run 
  1009.       then  check  that  you have set everything up  according  to  the 
  1010.       instructions. If you still have problems you may want to call iHn 
  1011.       Systems during the specified hours for assistance. 
  1012.       
  1013.       Assuming  that all has gone well and this example  is  executing, 
  1014.       continue on.
  1015.       
  1016.       PRESS  F1 to switch screens. You may want to recompile  with  the 
  1017.       debugger active and follow the logic through the example code.
  1018.       
  1019.       To see how the special key testing is done, try typing  unusual 
  1020.       CTRL key combinations and identify in the code how it is  testing 
  1021.       for ALT and CTRL key combinations. 
  1022.       
  1023.       Try turning CAPS LOCK, NUM LOCK, SCROLL LOCK, and INSERT MODE  on 
  1024.       and off while pressing other keys. This will show you how you can 
  1025.       identify  in your program the current status of the system  toggle 
  1026.       keys.
  1027.       
  1028.       This concludes the section that examines the programs that  Turbo 
  1029.       ScrEdit will generate for you.
  1030.       
  1031.       
  1032.       
  1033.       
  1034.       
  1035.       A look at ScrDemo.Exe.
  1036.       ----------------------------------------------------------------
  1037.       In  this section of the tutor we  will walk through  ScrDemo  the 
  1038.       main demonstration program supplied with Turbo ScrEdit.
  1039.       
  1040.       The  program ScrDemo has been supplied to serve as a  programming 
  1041.       example  that  uses almost every procedure and  function  in  the 
  1042.       Turbo ScrEdit interface modules.  This program has served as  the 
  1043.       "Test Program" used here at iHn Systems to test the Turbo ScrEdit 
  1044.       interface  modules as they were developed. The files  "ScrDemo.C" 
  1045.       and "ScrDemo.Pas" that came in your Turbo ScrEdit package contain 
  1046.       the source code for the file "ScrDemo.EXE." 
  1047.       
  1048.       The  previous examples were intended to help you get  comfortable 
  1049.       with  writing your own programs that use Turbo  ScrEdit  screens. 
  1050.       This  part of the tutor is intended to give you a closer look  at 
  1051.       
  1052.       
  1053.       
  1054.       
  1055.       
  1056.       
  1057.                                  Page T-3.16
  1058.       
  1059.       
  1060.       
  1061.       the syntax and usage of the features and procedures of the  Turbo 
  1062.       ScrEdit interface module. This will include looking at a  example 
  1063.       data   entry   screen,   interacting   with   the   mouse,    and 
  1064.       programmatically  changing  screen color  assignments,  and  much 
  1065.       more.
  1066.       
  1067.       *** Turbo C users ***
  1068.       If you are working with Turbo C, delete the file "ScrDemo.C"  and 
  1069.       rename   the   version  we  stored  earlier  in  the   tutor   as 
  1070.       "ScrDemo.Old" back to "ScrDemo.C".
  1071.       
  1072.       Your will need the following for this example:
  1073.            
  1074.            A  print  copy  of the files  "ScrDemo.C"  or  "ScrDemo.Pas" 
  1075.            depending on the compiler that you are using.
  1076.       
  1077.            Copy the following files into your work area on your system:
  1078.       
  1079.              Pascal                  C
  1080.              ---------------------   ------------------
  1081.              ScrDemo.P               ScrDemo.C
  1082.              ScrDemo.Scr             ScrDemo.Scr
  1083.                                      ScrDemo.Prj
  1084.              DemoWind.Exe
  1085.       
  1086.            You   should  already  the  following  files  from   previous 
  1087.            discussions:
  1088.       
  1089.               ScrDemo.001
  1090.               ScrDemo.002
  1091.               ScrDemo.003
  1092.               ScrDemo.004
  1093.               ScrDemo.005
  1094.       
  1095.            If  you  do  not  have  these  files  in  the  current  work 
  1096.            directory, load "ScrDemo.Scr" into the Turbo ScrEdit  screen 
  1097.            editor  and  re-compile all the screens using the  F4  menus 
  1098.            option. 
  1099.       
  1100.            ** Turbo C users ** 
  1101.                
  1102.               You  will  also  want to use the  project  file  that  we 
  1103.               created   in  the  last  example.  Make  sure  that   you 
  1104.               OPTION/COMPILER/MODEL  is still set to match  the  memory 
  1105.               model of the library specified in the project file.
  1106.       
  1107.       
  1108.       Next load your compiler and the compile and run ScrDemo.
  1109.       
  1110.       You  should now be setting  at your computer with this  tutor  of 
  1111.       course, the listing of the pascal or C version of ScrDemo  opened 
  1112.       to page 1, and the ScrDemo menu visible on you video monitor.
  1113.       
  1114.       
  1115.       
  1116.       
  1117.       
  1118.       
  1119.       
  1120.       
  1121.       
  1122.       
  1123.                                  Page T-3.17
  1124.       
  1125.       
  1126.       
  1127.       An overview of the source code.
  1128.       ----------------------------------------------------------------
  1129.       The  source listing has been divided in sections.  For  instants, 
  1130.       on the first page you will see some comments that reads:
  1131.       
  1132.       ***********************************
  1133.       MENU OPTION 1 (Example data entry screen)
  1134.       Section 2 of the Turbo ScrEdit Tutor Describes this portion of code.
  1135.       ***********************************
  1136.       
  1137.       Go  ahead a flip through the code, you will find other places  in 
  1138.       the code that have similar markers. 
  1139.       
  1140.       Locate the last text marker "PROGRAM BEGINS HERE" in the listing. 
  1141.       It will be clear at the end on the last page of the source file.
  1142.       
  1143.       
  1144.       PROGRAM BEGINS HERE
  1145.       
  1146.       This is where it all begins, so lets follow the logic.
  1147.       
  1148.       First  ScrDemo_Init is called. Look back in the code  and  locate 
  1149.       this procedure, but keep a marker here where the program  begins, 
  1150.       we will want to turn back to this point in a minute.
  1151.       
  1152.          Locate ScrDemo_Init in the source listing;
  1153.          --------------------------------------------------------------
  1154.          The first action of this procedure is to open the screen  file 
  1155.          "ScrDemo.Scr".
  1156.       
  1157.          Next the screen buffers are initialized.
  1158.       
  1159.          These  are the steps that should always be done as one of  the 
  1160.          first actions performed in your program. 
  1161.       
  1162.          ** IMPORTANT CONCEPT **
  1163.        
  1164.          1 - The screen file should always be opened before the  screen 
  1165.              buffers are initialized.
  1166.       
  1167.          2 - EVERY TIME A SCREEN FILE IS OPENED, it's screen's  buffers 
  1168.              must  be initialized. If you close a screen file  and  re-
  1169.              open it you must re-initialize all the screen buffers.
  1170.       
  1171.          ** ** ** ** ** ** ** **
  1172.       
  1173.          If  you  are going to have trouble using Turbo  ScrEdit,  most 
  1174.          likely it will be because you did not open and initialize  the 
  1175.          screen file and buffers in the right sequence.
  1176.       
  1177.          Next we see Turbo ScrEdit's feature control switches are being 
  1178.          set for this program.
  1179.       
  1180.          If you are unsure of what the function of these variables are, 
  1181.          look  them  up  in the user manual. There will  also  be  more 
  1182.       
  1183.       
  1184.       
  1185.       
  1186.       
  1187.       
  1188.       
  1189.                                  Page T-3.18
  1190.       
  1191.       
  1192.       
  1193.          examples  of how they work in the section that  describes  the 
  1194.          example data entry screen.
  1195.          --------------------------------------------------------------
  1196.       
  1197.       Okay, turn back to the "PROGRAM BEGINS HERE" marker.
  1198.       
  1199.       Next We see the procedure Read_Menu_Screen is performed.
  1200.       
  1201.          Read_Menu_Screen.
  1202.          -------------------------------------------------------------
  1203.          First  we will look just at how the menu section  works,  then 
  1204.          we will take a look at each of  the menu options.
  1205.       
  1206.          - We  see  first  that the screen "Demo_Menu"  is  opened  and 
  1207.            displayed on the video. 
  1208.       
  1209.          - The menu option variable is set to 1.
  1210.       
  1211.          - A  repeat/until  (Pascal) or do/while (C) loop  begins  that 
  1212.            will end when the escape key is pressed ("S_ESC" tests TRUE).
  1213.       
  1214.          - The  menu options that you can see on your screen are  moved 
  1215.            to the screen buffer.
  1216.       
  1217.          - Next  we see OPTION is tested for a valid setting.  This  is 
  1218.            where  the floating pointer "==>" is made to  "wrap"  around 
  1219.            from the top menu option to the bottom menu option, or  from 
  1220.            the bottom to top when the OPTION field has been incremented 
  1221.            to  a value greater or less than the actual number  of  menu 
  1222.            options in the option window.
  1223.       
  1224.          - Next  we  see that the "P" fields on our screens  are  being 
  1225.            reset to blanks. One of these fields will contain the  "==>" 
  1226.            pointer  that  moves up and down the menu list.  This  field 
  1227.            must  be  reset to blank before the pointer "==>"  is  moved 
  1228.            into  the next position or our menu would end up  with  more 
  1229.            that one pointer showing on the screen at the same time.
  1230.       
  1231.          - Next  is a case statement (Pascal) or switch  statement  (C) 
  1232.            that  is loading the option description that corresponds  to 
  1233.            the  current menu option pointed to by OPTION.  Notice  also 
  1234.            that  the "==>" pointer is moved back to the "P" field  that 
  1235.            corresponds to value of OPTION.
  1236.       
  1237.          - (Turbo C example) After the Screen has been loaded with  the 
  1238.            current   values   for  the  current  option,  a   call   to 
  1239.            S_ResetKeyFlags  re-sets all the global key  indicators.  In 
  1240.            this  case we will most likely be resetting the up  or  down 
  1241.            arrow key indicators.
  1242.       
  1243.          - You  will  notice here that the next  statement  is  another 
  1244.            repeat/until statement (pascal) or a while/do statement (C), 
  1245.            and you will also notice that this loop will continue  until 
  1246.            the <ESCAPE>, <ENTER>, or any of the other special keys have 
  1247.            been pressed. 
  1248.       
  1249.       
  1250.       
  1251.       
  1252.       
  1253.       
  1254.       
  1255.                                  Page T-3.19
  1256.       
  1257.       
  1258.       
  1259.            if we did not call S_ResetKeyFlags, C version only, any  one 
  1260.            of these key indicator may be set to a value of TRUE so  the 
  1261.            loop would never be perform and our program would go into  a 
  1262.            infinite loop.
  1263.       
  1264.          - Inside  this  next  loop we see a  call  S_ReadKey  and  the 
  1265.            program  waits here for a key to be pressed. This  is  where 
  1266.            the program that is running on your system is right now.
  1267.       
  1268.          - Next  we  see an "IF" statements that is only  true  if  the 
  1269.            ENTER  key, UP ARROW key, or DOWN ARROW key is  pressed.  If 
  1270.            you  look  ahead in the code to the ELSE condition  for  the 
  1271.            first  "IF", you will see where a message is issued  telling 
  1272.            the user that a invalid keys has been pressed and what  keys 
  1273.            the program expects.
  1274.             
  1275.            PRESS SOME KEYS TO SEE HOW THE PROGRAM DISPLAYS THE MESSAGE.
  1276.       
  1277.            The  second  two  "IF" statements are testing  for  the  UP, 
  1278.            or DOWN arrow keys.
  1279.            
  1280.         Notice the next two "IF" statements that are testing the "PgUp" 
  1281.         and "PgDn" key indicator status. 
  1282.       
  1283.         PRESS THE <DOWN ARROW> KEY ON YOUR KEYBOARD SEVERAL TIMES.
  1284.       
  1285.         Notice that the pointer ("==>") moves down each time you  press 
  1286.         the  down arrow key. You can see in the code that  when  S_DOWN 
  1287.         tests true  the variable OPTION is decremented by 1. 
  1288.       
  1289.         Keep  pressing the down arrow until the light bar "wraps"  back 
  1290.         around to the top line of the option window.
  1291.       
  1292.         Next try the UP ARROW and see how it works the same way only in 
  1293.         the other direction.
  1294.       
  1295.         Each time you press a key, this inner repeat/until or  while/do 
  1296.         loop  is  satisfied  and the program goes clear  back  to  the 
  1297.         beginning  of the procedure where it check the value of  OPTION 
  1298.         and   then  loads  the  screen  with  the  next   menu   option 
  1299.         description.
  1300.       
  1301.         Next  notice  the if statement that is checking for  the  ENTER 
  1302.         key.  When  the  ENTER key has been pressed  then  the  program 
  1303.         begins  checking  to see which option it is to  branch  to  and 
  1304.         execute. 
  1305.       
  1306.       That describes the way the menu routine works. Next will we begin 
  1307.       looking at each of the menu options.
  1308.       
  1309.       
  1310.       
  1311.       
  1312.       
  1313.       
  1314.       
  1315.       
  1316.       
  1317.       
  1318.       
  1319.       
  1320.       
  1321.                                  Page T-3.20
  1322.       
  1323.       
  1324.       
  1325.       Menu Option 1 (an example data entry screen).
  1326.       -----------------------------------------------------------------
  1327.       The  most common use of Turbo ScrEdit is to develop a data  entry 
  1328.       screen  quickly  and efficiently. This example will  give  you  a 
  1329.       example  of  how  to use all the data  entry  features  of  Turbo 
  1330.       ScrEdit, as well as how to use many other features. 
  1331.       
  1332.       Lets take a look at it.
  1333.       
  1334.       MOVE THE POINTER ("==>") TO THE FIRST MENU OPTION.
  1335.         
  1336.       Place  a marker in the listing at this point so you will be  able 
  1337.       to  locate  your  place when we return from  examining  how  this 
  1338.       option works.
  1339.       
  1340.       PRESS ENTER.
  1341.       
  1342.       The demonstration data entry screen is now on your display.  
  1343.       
  1344.       RecordDemo
  1345.       -----------------------------------------------------------------
  1346.          Flip back to the first page of the source listing and we  will 
  1347.          pick  up the program flow in the section marked  "MENU  OPTION 
  1348.          1".
  1349.       
  1350.          First lets scan through this section and quickly review all  the 
  1351.          procedures that make up this part of the demo program.
  1352.       
  1353.          First is RecordDemo_Init.
  1354.          Next  is a function MakeMsg.
  1355.          Next  is the procedure EnterRecords.
  1356.          Next  is the procedure RecordDemo;
  1357.       
  1358.          Lets pick up the program flow as it enters RecordDemo.
  1359.       
  1360.          First  thing we find is a call to RecordDemo_Init.  So..  flip 
  1361.          back  in  the  program  to  RecordDemo_Init.  There  are  some 
  1362.          important things to see in this routine.
  1363.       
  1364.          RecordDemo_Init
  1365.          --------------------------------------------------------------
  1366.          -  The  first thing inside of the initialization routine is  a 
  1367.             call  to the screen initialization procedure. 
  1368.             
  1369.          -  Next  we see a group of variables are set to  null  strings 
  1370.             and zeros. These fields are going to be where we store  the 
  1371.             data  that  we  enter into the  screen  during  this  demo. 
  1372.             Normally  you would store the data you enter in a  file  on 
  1373.             the disk. You will notice that this screen has two sections 
  1374.             that have fields labeled for name and address. The top  one 
  1375.             is  intended  to act like a record for our demo,  and  will 
  1376.             also demonstrate how "display only" fields can be used.
  1377.       
  1378.          - Next the screen "Dupe_Fields" is loaded.
  1379.           
  1380.       
  1381.       
  1382.       
  1383.       
  1384.       
  1385.       
  1386.       
  1387.                                  Page T-3.21
  1388.       
  1389.       
  1390.       
  1391.            S_ClearScreen and SET statements. 
  1392.            ------------------------------------------------------------
  1393.          - Next the screen is cleared with a call to  S_ClearScreen(1). 
  1394.            The  "1"  used  as the argument for  the  call  tells  Turbo 
  1395.            ScrEdit  to  set  all  fields to  there  initial  values  as 
  1396.            specified in field processing statements.  
  1397.       
  1398.            Look  at the first field, "DATE", in the screen  listing  of 
  1399.            "Dupe_Fields".  See the SET 'SYSDATE' statement  on the  line 
  1400.            below the field.  This statement tell Turbo ScrEdit to place 
  1401.            the  system  date  in this field each  time  the  screen  is 
  1402.            cleared  using S_ClearScreen. Thus you see a date  displayed 
  1403.            at the top of the screen.
  1404.        
  1405.            Also  look on the second page of the screen listing  at  the 
  1406.            field  "NAME2." This field has three  processing  statements 
  1407.            assigned to it. The first is a "help" statement.
  1408.       
  1409.            TYPE ?
  1410.       
  1411.            The  "HELP" message defined for this field has  appeared  on 
  1412.            the bottom line of the screen. Any data entry field can have 
  1413.            a "help" message associated to it. If you glance through the 
  1414.            screen  listing you will see that all the data entry  fields 
  1415.            have help statements defined for them. 
  1416.                           
  1417.            Next  we  see  a "EDIT" statement. Notice  that  the  "mask" 
  1418.            portion  of  the edit statement is made up of  "$"  and  "4" 
  1419.            characters separated by some spaces and a comma. 
  1420.       
  1421.            PRESS "X" and fill the entire field with X's.
  1422.       
  1423.            Notice the effect that the edit mask has. When you tried  to 
  1424.            type into the portion of the field where the comma or spaces 
  1425.            are,  the  cursor  skips over  them.  Those  characters  are 
  1426.            "edited"  into the field because of the edit mask. Also  try 
  1427.            deleting  characters.  in the last, first, and  middle  name 
  1428.            sections of the field. Notice how the edit mask efects  that 
  1429.            way that characters are deleted from the field.
  1430.       
  1431.            Next  we  see  that  the field has  a  "SET"  statement  that 
  1432.            assigns  the literal "Last         , First          Mid"  to 
  1433.            the screen. 
  1434.       
  1435.            What  I really want you to notice here is how the "SET"  and 
  1436.            "EDIT"  mask are use together on this field. You  might  use 
  1437.            the same concept on a data entry date field:
  1438.       
  1439.                SET 'SYSDATE'
  1440.                EDIT '33/##/3333'
  1441.                DATE MM/DD/YYYY
  1442.        
  1443.                In this example the field is initialized with the system 
  1444.                date. If your user changes the date, the edit mask  will 
  1445.                only  accept numeric characters in the month,  day,  and 
  1446.                year portion of the field. Then the DATE statement  will 
  1447.                verify that the date keyed contains valid month and  day 
  1448.                values (includeing leap year conciderations.)
  1449.       
  1450.       
  1451.       
  1452.       
  1453.                                  Page T-3.22
  1454.       
  1455.       
  1456.       
  1457.            Also locate the field "GROSS2" and it's "SET" statement. You 
  1458.            will notice how this "SET" statement has effected the  field 
  1459.            "Annual Gross" on the screen. 
  1460.       
  1461.          - Control exits back to the procedure "RecordDemo".
  1462.       
  1463.       
  1464.       
  1465.       Back in RecordDemo, we see a loop begins that will continue until 
  1466.       the  ESCAPE  key  is  pressed. Each time  through  the  loop  the 
  1467.       procedure  "EnterRecords" is performed. Flip back in the code  to 
  1468.       this procedure.
  1469.       
  1470.       
  1471.       EnterRecords
  1472.       -----------------------------------------------------------------
  1473.       Skip  over the first "IF" statement that you see here and  locate 
  1474.       the call to "S_ReadScreen". 
  1475.       
  1476.       This is where the program on the screen is busy scanning the  key 
  1477.       board waiting for us to press a key or type a value.
  1478.       
  1479.       This  portion  of the ScrDemo program is to function as  a  model 
  1480.       date entry screen. We see the screen could be divided into  three 
  1481.       sections. The bottom section of the screen contains the  function 
  1482.       key  labels. Each key has been assigned a special  function  that 
  1483.       will demonstrate one of Turbo ScrEdit's features.
  1484.       
  1485.       The  middle section of the screen is the data entry  section.  We 
  1486.       will  key data into these fields and be able to  experiment  with 
  1487.       the data entry and editing features of Turbo ScrEdit.
  1488.       
  1489.       The  top  section of the screen will be our one record  file  for 
  1490.       storing the data that we key in.
  1491.       
  1492.       First lets look at doing simple data entry. In the bottom line of 
  1493.       function key labels notice the label associated to the ENTER  key 
  1494.       reads "Accept Record".
  1495.       
  1496.       PRESS ENTER
  1497.       
  1498.       Turbo  ScrEdit processed the screens field validation  statements 
  1499.       and  has located an error condition. The cursor has  advanced  to 
  1500.       the "CITY" field and has displayed a message "Expected Tulare  or 
  1501.       Pocatello".   Look up the "City2" in the screen listing  and  see 
  1502.       the processing statements assigned to it.
  1503.       
  1504.       We  see that only one of the two city names will be  accepted  in 
  1505.       this field. 
  1506.       
  1507.       TYPE one of the valid city names.
  1508.       
  1509.       PRESS ENTER.
  1510.       
  1511.       Next  we see that "State" must also have a value keyed  into  it, 
  1512.       and that it must be "CA" or "ID".
  1513.       
  1514.       
  1515.       
  1516.       
  1517.       
  1518.       
  1519.                                  Page T-3.23
  1520.       
  1521.       
  1522.       
  1523.       TYPE one of the valid state abbreviations.
  1524.       
  1525.       GO  AHEAD  AND TYPE VALUES INTO ANY OF THE OTHER  FIELDS  ON  THE 
  1526.       SCREEN THAT YOU WISH. ESPECIALLY NOTICE HOW THE EDIT MASKS EFFECT 
  1527.       KEYING  DATA  INTO THE ZIP CODE FIELD, PHONE  NUMBER  FIELD,  AND 
  1528.       SOCIAL SECURITY FIELD.
  1529.       
  1530.       PRESS ENTER.
  1531.       
  1532.       This time the screen has been re-initialized and the values  that 
  1533.       were  in  our data entry screen when we pressed enter  have  been 
  1534.       stored in the upper portion of the screen.
  1535.       
  1536.       Lets look at what the program did when we pressed the ENTER key.
  1537.       
  1538.       When we pressed "ENTER" control returned from "S_ReadScreen"  and 
  1539.       proceeded through our code.
  1540.       
  1541.       This first "IF" statement is ignored because we did not press the 
  1542.       CTRL key.
  1543.       
  1544.       The  "WHILE"  statement is skipped because the ENTER key  is  not 
  1545.       included in the listed of keys that it is testing for.
  1546.       
  1547.       Skip past the "IF" statements testing for function keys in  S_F1, 
  1548.       S_F2, S_F3, S_F4, S_F5, S_F9, and S_F10
  1549.       
  1550.       The  last  "IF"  statement in this procedure is  testing  for  two 
  1551.       conditions  that  include  the  "ENTER"  statement.  We  are  now 
  1552.       interested  in  the  first condition where  the  global  variable 
  1553.       S_EnterAsTab is false, and S_Enter is true.
  1554.       
  1555.       First  we  see that the values keyed into data entry  fields  are 
  1556.       copied  into the global variables that we initialzed  earlier  in 
  1557.       the the initialization routine that are not defined in the screen 
  1558.       record.
  1559.       
  1560.       Next  we  see  a call to S_ClearScreen is performed  with  a  "1" 
  1561.       argument.  This  cleared  all the fields on the  screen  and  re-
  1562.       assigned the initial values as per any "SET" statements that were 
  1563.       defined for the screen fields.
  1564.       
  1565.       Next  the  data that we stored in the global variables  is  moved 
  1566.       back into fields in the top portion of the screen. 
  1567.       
  1568.       S_Point is set to point to the name field on the screen.
  1569.       
  1570.       Control  now  exits this procedure and returns to  the  procedure 
  1571.       RecordDemo.  Since we are in a loop in RecordDemo that won't  end 
  1572.       until   the  ESCAPE  key  is  pressed,  control  goes   back   to 
  1573.       EnterRecords again and ends up back at S_ReadScreen.
  1574.       
  1575.       On  the screen we see that the data entry area has  been  cleared 
  1576.       and  the data that we typed in is now in the top portion  of  the 
  1577.       screen.
  1578.       
  1579.       
  1580.       
  1581.       
  1582.       
  1583.       
  1584.       
  1585.                                  Page T-3.24
  1586.       
  1587.       
  1588.       
  1589.       S_EnterAsTab
  1590.       ----------------------------------------------------------------
  1591.       Normally  Turbo ScrEdit uses the TAB key to move the cursor  form 
  1592.       field  to  field and the ENTER key to signal that the  screen  is 
  1593.       ready to be processed.
  1594.       
  1595.       Several  users requested that the ENTER key be made to  act  more 
  1596.       like  the TAB key. That is when enter is pressed the cursor  just 
  1597.       advances to the next field. So we added S_EnterAsTab. 
  1598.       
  1599.       Notice the F9 key label reads "Toggle Accept Key." and next to it 
  1600.       the ENTER key label reads "Accept Record".
  1601.       
  1602.       PRESS F9
  1603.       
  1604.       Notice  that the ENTER key label has now changed to the  F10  key 
  1605.       label.
  1606.       
  1607.       PRESS ENTER SEVERAL TIMES and watch the cursor.
  1608.       
  1609.       Now  the cursor moves from field to field just as though the  TAB 
  1610.       key  is being pressed. As far as Turbo ScrEdit is  concerned  the 
  1611.       ENTER and TAB keys are the same keys.
  1612.       
  1613.       PRESS F10
  1614.       
  1615.       The  F10  key  now has the same effect that  the  ENTER  key  had 
  1616.       before.
  1617.       
  1618.       TYPE  DATA INTO THE SCREEN FIELDS (use the ENTER and TAB keys  to 
  1619.       advance from field to field) AND PRESS F10 AGAIN. 
  1620.       
  1621.       If  you  took the time to fill in several fields and  re-key  the 
  1622.       city and state fields,  when you pressed the F10 key the data you 
  1623.       keyed  moved to the top portion of the screen just as it  did  in 
  1624.       the previous example when the ENTER key was pressed.
  1625.       
  1626.       First  locate  the "IF" statement at the very  beginning  of  the 
  1627.       EnterRecords  procedure.  This  "IF" statement  moves  the  value 
  1628.       "ENTER" or "F10" to the function key label for "Accept Record". 
  1629.       
  1630.       PRESS F9 several times and notice how the label changes.
  1631.       
  1632.       Next Locate the "IF" statement that is testing "S_F9". When  user 
  1633.       has  pressed  the  F9  key and S_F9  tests  true,  the  value  of 
  1634.       S_EnterAsTab is toggled to its opposite value.
  1635.       
  1636.       Next notice in the procedure the handled the ENTER key that  it's 
  1637.       second condition or "OR" condition is set for when "S_EnterAsTab" 
  1638.       tests true and the F10 key has been pressed.
  1639.       
  1640.       Before you try to use the ENTER AS TAB option in your program, be 
  1641.       sure  to look up and read about S_EnterAsTab in  the  programmers 
  1642.       reference manual. 
  1643.       
  1644.       
  1645.       
  1646.       
  1647.       
  1648.       
  1649.       
  1650.       
  1651.                                  Page T-3.25
  1652.       
  1653.       
  1654.       
  1655.       One of the major differences is that Turbo ScrEdit will no longer 
  1656.       automatically perform field validation. Instead you will have  to  
  1657.       call  the  validation  procedure  yourself.  Look  at  the   "IF" 
  1658.       statement  just  above the one that processed our ENTER  and  F10 
  1659.       keys.
  1660.       
  1661.       Here you see what is required to perform screen field  validation 
  1662.       when   you  are  using  ENTER  as  TAB.   The   global   variable 
  1663.       S_ScreenValid  is  set to TRUE just  before  S_ValidateScreen  is 
  1664.       performed.  If S_ScreenValid is still TRUE when control  returns 
  1665.       from S_ValidScreen, then the screen has good data in its  fields. 
  1666.       If S_ScreenValid is FALSE when control returns, S_Point be set to 
  1667.       the  field  number of the offending field. We reset all  our  key 
  1668.       indicator   fields  so  no  further  processing  will  be   done, 
  1669.       particularly  the  ENTER  or F10  key  processing.  Then  control 
  1670.       returns  back  to  the  top of  this  procedure  and  drops  into 
  1671.       S_ReadScreen. Turbo ScrEdit then displays the field error message 
  1672.       and place the cursor on the field with bad data.
  1673.       
  1674.       
  1675.       
  1676.       
  1677.       Dupe Fields (S_IsDupe, S_SetDupe, S_ClearDupes)
  1678.       -----------------------------------------------------------------
  1679.       Next  lets look at the advantage of using DUPE fields. Locate  the 
  1680.       function  key  labels for F1 and F2. We see F1  reads  "Set/Clear 
  1681.       Dupe Fields" and F2 reads "Clear All Dupe Flds". 
  1682.       
  1683.       Dupe fields are very useful for fields like city and state. 
  1684.       
  1685.       TYPE a valid value into CITY but do not press ENTER or TAB. Leave 
  1686.       the cursor in the CITY field.
  1687.       
  1688.       Press F1
  1689.       
  1690.       When  you pressed the F1 key a pair of brackets appeared  to  both 
  1691.       sides  of the field. I have programmed this screen to  use  these 
  1692.       brackets to indicate when a field is in DUPE MODE. These brackets 
  1693.       are  not  required, and have no effect on how this  program  will 
  1694.       work. The brackets are just the way I have chosen to help you  be 
  1695.       able to see which of the fields is set to DUPE status.
  1696.       
  1697.       Do the same for the STATE field:
  1698.       
  1699.       Now  you should have valid values in the city and  state  fields. 
  1700.       Press  the  tab key so the cursor moves all the  way  around  the 
  1701.       screen  to the second line of address. (Do not use the SHIFT  TAB 
  1702.       yet, just use TAB.)
  1703.       
  1704.       At this point your cursor is blinking in the field directly above 
  1705.       CITY field. 
  1706.       
  1707.       WATCH THE CURSOR AS YOU PRESS THE TAB KEY AGAIN.
  1708.       
  1709.       Dupe  fields  are skipped as the cursor advances  "forward"  from 
  1710.       field to field. 
  1711.       
  1712.       
  1713.       
  1714.       
  1715.       
  1716.       
  1717.                                  Page T-3.26
  1718.       
  1719.       
  1720.       
  1721.       Changing the value of a DUPE FIELD.
  1722.       -----------------------------------------------------------------
  1723.       If you need to change the value of a DUPE field you can do so  by 
  1724.       using SHIFT and TAB to move the cursor backwards into the  field. 
  1725.       You  can  then type a new value into the field. When  the  cursor 
  1726.       exits the field the new value will become the dupe value.
  1727.       
  1728.       TYPE date into the other fields on the screen.
  1729.       
  1730.       PRESS  ENTER  (or F10 depending on the mode that your  screen  is 
  1731.       in).
  1732.       
  1733.       This time when the data was moved up on the screen and the screen 
  1734.       fields  were  cleared, the CITY and STATE fields  retained  their 
  1735.       values.
  1736.       
  1737.       Lets  look at the coding that sets dupe fields. Locate  the  "IF" 
  1738.       statements that test "S_F1".  First in this logic we see S_IsDupe 
  1739.       is  used  to  check the DUPE status of the  current  field.  This 
  1740.       function  will return TRUE if the field is a DUPE field or  FALSE 
  1741.       if the field is a regular data entry or display only field.
  1742.       
  1743.       In  this  example if the current data entry field is not  a  DUPE 
  1744.       field  so  the  program calls S_SetDupe three times  to  set  the 
  1745.       bracket fields and the current field to DUPE status. 
  1746.       
  1747.       ** IMPORTANT CONCEPT ** 
  1748.       
  1749.       Notice the order that the fields are being set to dupe status. If 
  1750.       we were to set the bracket fields to dupe status AFTER we set the 
  1751.       current field to dupe status, the cursor would advance out of the 
  1752.       current  field to the next data entry field on the screen.   This 
  1753.       is  because  Turbo ScrEdit has to do some special  processing  to 
  1754.       allow  the field to remain in the dupe field. So always  set  the 
  1755.       dupe status for the data entry field you want the cursor to be in 
  1756.       LAST when you are setting DUPE status for more than one field.
  1757.       
  1758.       Notice  that  the two other fields that are used to  display  the 
  1759.       brackets  are also set to dupe fields. Next is a switch  or  case 
  1760.       statement that determines which field the cursor was on when  the 
  1761.       F1 key was pressed and places brackets in the fields around it.
  1762.       
  1763.       Use  SHIFT and TAB to move the cursor backwards into one  of  our 
  1764.       dupe fields.
  1765.       
  1766.       PRESS F1 again.
  1767.       
  1768.       Notice that the brackets disappear and the field is set back to a 
  1769.       regular data entry field status. 
  1770.       
  1771.       Locate  the  ELSE condition of the "IF" statement that  test  the 
  1772.       field  status  using S_IsDupe. This routine uses  S_ReSetDupe  to 
  1773.       reset  the  field  to it's original field data  entry  type,  and 
  1774.       blanks out the brackets.
  1775.       
  1776.       
  1777.       
  1778.       
  1779.       
  1780.       
  1781.       
  1782.       
  1783.                                  Page T-3.27
  1784.       
  1785.       
  1786.       
  1787.       As  I  mentioned  earlier, the brackets that I am  using  on  the 
  1788.       screens are optional. In your programs you will probably not want 
  1789.       to  place brackets around the DUPE fields like I have done  here. 
  1790.       If that were so,  you could condense this whole routine down  to:
  1791.       
  1792.          Pascal                            C
  1793.          -------------------------------   ------------------------------
  1794.          If  S_F1 Then                     if  (S_F1)
  1795.              Begin                             {
  1796.              If  S_IsDupe(S_PrevFld) Then      if (S_IsDupe(S_PrevFld))
  1797.                  S_SetDupe(S_PrevFld)              S_SetDupe(S_PrevFld);
  1798.              Else                              else 
  1799.                  S_ResetDupe(S_PrevFld);           S_ReSetDupe(S_PrevFld);
  1800.              End;                              }
  1801.       
  1802.       The  above examples would cause the DUPE fields to act  just  the 
  1803.       same as they do now except the brackets would not be used on  the 
  1804.       screen.  The user of your program will know when he  encouters  a 
  1805.       DUPE field because the cursor will skip over it.
  1806.       
  1807.       Next Set all the fields on the screen to DUPE status.
  1808.       
  1809.       Notice  when you tried to set the last field to dupe  that  Turbo 
  1810.       ScrEdit would not let you. At least one field must remain a  data 
  1811.       entry field. 
  1812.       
  1813.       Now lets clear all the dupe fields set on the screen at once.
  1814.       
  1815.       PRESS F2
  1816.       
  1817.       Locate the F2 if statement and you will see it calls S_ClearDupes.
  1818.       
  1819.       S_ClearScreen  resets  all screen fields back to  their  original 
  1820.       status.
  1821.       
  1822.       The remainder of this routine removes the brackets that may be on 
  1823.       the screen by blanking out all the bracket fields.
  1824.       
  1825.       Sound ON/OFF
  1826.       -----------------------------------------------------------------
  1827.       Locate the F3 function key label that reads "On/Off Sound".  This 
  1828.       key will toggle sound mode on and off. Locate the "IF"  statement 
  1829.       that tests for S_F3 TRUE. 
  1830.       
  1831.       In  this example I am testing the value S_HelpSound. When F3  has 
  1832.       been pressed and S_HelpSound is set to TRUE, then sound is turned 
  1833.       OFF  by setting the different message line sound flags to  FALSE. 
  1834.       
  1835.       The opposite logic is used to turn sound back on.
  1836.        
  1837.       In your programs you can set and reset any of the sound variables 
  1838.       indepent  of each other. You may want to turn sound off  for  the 
  1839.       help messages by setting S_HelpSound to FALSE, and leave sound on 
  1840.       for  error  messages (S_ErrorSound) and  user  generated  message 
  1841.       (S_UserSound.).
  1842.       
  1843.       Try pressing the ENTER key a few times while using the F3 key  to 
  1844.       toggle sound on and off.
  1845.       
  1846.       
  1847.       
  1848.       
  1849.                                  Page T-3.28
  1850.       
  1851.       
  1852.       
  1853.       Auto Help ON/OFF
  1854.       ----------------------------------------------------------------
  1855.       You  will recall that keying a ? mark into any of the data  entry 
  1856.       fields will cause a help message to appear on the bottom line  of 
  1857.       the screen. One of our user asked that the help messages be  made 
  1858.       to display automatically when the field was edited. It sound like 
  1859.       a good idea so we created the S_AutoHelp message logic.
  1860.       
  1861.       Locate the F4 function key label.
  1862.       
  1863.       This  key  will demonstrate using the  "AutoHelp"  feature.  With 
  1864.       "AutoHelp" active, the field help messages will be displayed each 
  1865.       time cursor moves from field to field.
  1866.       
  1867.       First  look up the "IF" statement that test "S_F4". You will  see 
  1868.       that this procedure is toggling the global field "S_AutoHelp"  on 
  1869.       and off.
  1870.       
  1871.       PRESS F4
  1872.       
  1873.       PRESS TAB to move the cursor from field to field.
  1874.       
  1875.       Notice that each time the cursor enters a field it displays  that 
  1876.       fields help message. The message will disappear when the next key 
  1877.       is pressed.
  1878.       
  1879.       PRESS F4 to turn off "Auto Help".
  1880.       
  1881.       
  1882.       Auto Validate ON/OFF
  1883.       ----------------------------------------------------------------
  1884.       Again we had a user request that field validation could occur  at 
  1885.       the  time that data was entered into a field. That  also  sounded 
  1886.       like  a pretty good idea.. so we introduced the  "Auto  Validate" 
  1887.       logic. 
  1888.       
  1889.       Locate  the F5 function key label that reads "On/Off  Auto  Val". 
  1890.       This  procedure demonstrates using Turbo ScrEdit's Auto  Validate 
  1891.       option. 
  1892.       
  1893.       Normally  field validation occurs when the ENTER key is  pressed. 
  1894.       And then the entire screen is validated at one time.
  1895.       
  1896.       Using  this  option you can force Turbo ScrEdit to  validate  the 
  1897.       contents  of the current data entry field just before the  cursor 
  1898.       moves out of it to a new field. 
  1899.       
  1900.       PRESS F5
  1901.       
  1902.       PRESS TAB to move the cursor around the fields on the screen.
  1903.       
  1904.       The  cursor  should stop when you get to the City field  and  the 
  1905.       familiar message will appear on the message line.
  1906.       
  1907.       Locate  the F6 function key label that reads "Edit  Last  Entry". 
  1908.       This  procedure just moves the field values from the top  portion 
  1909.       of the screen down into the edit fields of the screen.
  1910.       
  1911.       
  1912.       
  1913.       
  1914.       
  1915.                                  Page T-3.29
  1916.       
  1917.       
  1918.       
  1919.       Changing Message line Colors
  1920.       -----------------------------------------------------------------
  1921.       Next  locate the "while" statement that is conditioned  depending 
  1922.       on the values of HOME, END, UP ARROW, DOWN ARROW, PGUP, and  PGDN 
  1923.       keys.
  1924.       
  1925.       This  routine  demonstrates  how to change the  colors  used  for 
  1926.       displaying messages. Turbo ScrEdit provides three message fields. 
  1927.       You  will  normally  use  only the  "S_UserMsg"  fields  in  your 
  1928.       programs.  Turbo ScrEdit uses "S_ErrorMsg" and "S_HelpMsg".  Even 
  1929.       though  you  won't  use the other two fields, you  will  want  to 
  1930.       control the colors that are used to display their messages.
  1931.       
  1932.       If  you  look inside the "while" loop you will see that  first  a 
  1933.       message  provided  by the function "MakeMsg" is  moved  into  the 
  1934.       message  field that corresponds to the key that was  pressed.  If 
  1935.       you look back into the coding of the "MakeMsg" function you  will 
  1936.       see that it converts  background and foreground color codes  into 
  1937.       text  and  builds  a  message  line  that  includes  the  current 
  1938.       settings.
  1939.       
  1940.       Next you will see a call to S_ReadKey.
  1941.       
  1942.       Next  you  will  see where the background  and  foreground  color 
  1943.       fields  for  each  of the message  fields  is  being  incremented 
  1944.       depending on which keys are pressed.
  1945.       
  1946.       Now go ahead and try pressing the keys.
  1947.       
  1948.       The  purpose of this example is to demonstrate that  by  changing 
  1949.       the values of S_HelpBg or S_HelpFg you will change the color that 
  1950.       is  used  when S_HelpMsg is displayed. The same  holds  true  for 
  1951.       S_ErrorBg, S_ErrorFg, and S_ErrorMsg. This allows you to  control 
  1952.       the colors used by Turbo ScrEdit when it displays messages.
  1953.       
  1954.       Likewise,  you  can  control how the messages that  you  move  to 
  1955.       S_UserMsg  are  displayed by changing the  color  assignments  of 
  1956.       S_UserBg and S_UserFg.
  1957.       
  1958.       PRESS ESC
  1959.       
  1960.       Control  now  drops  out of the loop we began  in  the  procedure 
  1961.       RecordDemo. Before we exit this procedure and return to the  main 
  1962.       menu  we see some house keeping is being performed. Most of  this 
  1963.       is  just getting things in order for the next time that  we  call 
  1964.       this procedure.
  1965.       
  1966.       Well that ends the discussion of Option 1 - A data entry example. 
  1967.       We now return to our menu to pick up with Option 2.
  1968.       
  1969.       
  1970.       
  1971.       
  1972.       
  1973.       
  1974.       
  1975.       
  1976.       
  1977.       
  1978.       
  1979.       
  1980.       
  1981.                                  Page T-3.30
  1982.       
  1983.       
  1984.       
  1985.       Menu Option 2 (Demo of Mouse Functions).
  1986.       -----------------------------------------------------------------
  1987.       Skip this section if you do not have a mouse.
  1988.       
  1989.       If you do have a mouse and your mouse driver has not been  loaded 
  1990.       into  memory,   exit now to the dos prompt and  load  your  mouse 
  1991.       driver.
  1992.       
  1993.       Return now to the main menu portion of the code and locate  where 
  1994.       OPTION 2 is being performed.
  1995.       
  1996.       Press the DOWN ARROW key to place the menu pointer next to  "Demo 
  1997.       of Mouse Functions" label on the menu.
  1998.       
  1999.       S_MouseInstalled
  2000.       -----------------------------------------------------------------
  2001.       The first thing we see as the menu begins to process option 2, is 
  2002.       an  "IF"  statement testing the TRUE/FALSE status of  the  global 
  2003.       variable  S_MouseInstalled.  During program  initialization,  the 
  2004.       mouse initialization procedure checks to see if the mouse  driver 
  2005.       is   loaded   into  memory.   If  no  mouse  driver   is   found, 
  2006.       S_MouseInstalled  is  set to FALSE. In our program  example,  the 
  2007.       mouse  driver has not been found in memory, the "ELSE"  condition 
  2008.       is  performed  and  a error message is moved  to  the  S_ErrorMsg 
  2009.       field.
  2010.       
  2011.       When  the  mouse  driver is present, the  mouse  demo  screen  is 
  2012.       loaded  and  control  branches to the mouse  demo  routine.  When 
  2013.       control returns from the mouse demo routine the main menu  screen 
  2014.       is reloaded.
  2015.       
  2016.       PRESS ENTER
  2017.       
  2018.       The mouse demonstration screen is now displayed on the screen. 
  2019.       
  2020.       Locate the routine MouseDemo in our source code example.
  2021.       
  2022.       
  2023.       
  2024.       S_ActivateMouse
  2025.       ----------------------------------------------------------------
  2026.       S_ActivateMouse  is the first procedure called when you  wish  to 
  2027.       begin interacting with the mouse driver. This procedure could  be 
  2028.       said  to  "turn  the mouse driver on".  All  call  to  the  mouse 
  2029.       procedures will be ignored until the mouse driver is activated.
  2030.       
  2031.       
  2032.       
  2033.       S_SetMouseEvent
  2034.       -----------------------------------------------------------------
  2035.       When the mouse system is initialized, the mouse driver is started 
  2036.       in neutral, so to speak. The mouse driver is monitoring the mouse 
  2037.       but  will  not  interupt  our program.  Before  we  can  get  any 
  2038.       information   from  the  mouse  driver  we  must  tell  it   what 
  2039.       information  we  want it to report to our program.  Next  We  see 
  2040.       S_SetMouseEvent  is called and  that the contents of one  of  the 
  2041.       
  2042.       
  2043.       
  2044.       
  2045.       
  2046.       
  2047.                                  Page T-3.31
  2048.       
  2049.       
  2050.       
  2051.       screen fields is being passed as the argument. If you look in the 
  2052.       lower  right hand corner of the screen you will see the  contents 
  2053.       of  the field that is being passed. It holds a string of 1's  and 
  2054.       0's, "01111110". Each of these characters represent the status of 
  2055.       a bit in a single byte field that is passed to the mouse  driver. 
  2056.       Each  of  the  bits represents a mouse activity  that  the  mouse 
  2057.       driver  will  use  as a trigger to know  when  to  interrupt  our 
  2058.       program and pass the current status of the mouse to our program.
  2059.       
  2060.       In  the  discussion that follows you will see how  different  bit 
  2061.       patterns effect how the mouse driver acts. 
  2062.       
  2063.       TAKE  A  MOMENT HERE AND LOOK UP "S_SetMouseEvent" IN  THE  MOUSE 
  2064.       SECTION OF THE PROGRAMMERS REFERENCE MANUAL.  There you will find 
  2065.       a description of the bit mask and which mouse functions each  bit 
  2066.       effects.  We  will  also discuss this subject in  more  detail  a 
  2067.       little later in this section.
  2068.       
  2069.       
  2070.       
  2071.       S_SetMouseRange
  2072.       -----------------------------------------------------------------
  2073.       By default the mouse cursor can be moved anywhere on the  screen. 
  2074.       This procedure allow you to "fence" the mouse in by specifying  a 
  2075.       "mouse window". 
  2076.       
  2077.       If you look in the "Current Mouse Activity" section of the screen 
  2078.       and locate the section titled "Mouse Window". Notice that it  has 
  2079.       labels for "row" and "column" and "upper left" and "lower right". 
  2080.       These  fields indicate the current mouse window. If you move  the 
  2081.       mouse  up and down, and left and right, you will see that it will 
  2082.       not move out of the area defined here as the "Mouse Window".
  2083.       
  2084.       
  2085.       
  2086.       S_MsRow and S_MsCol
  2087.       -----------------------------------------------------------------
  2088.       These  fields  have two purposes. First they report to  your  the 
  2089.       mouse  cursor location when the last event occurred.  Second  the 
  2090.       can be used to relocate the mouse on the screen. 
  2091.       
  2092.       
  2093.       S_ShowMouse
  2094.       -----------------------------------------------------------------
  2095.       This  procedure  is what makes the mouse cursor  visible  on  the 
  2096.       screen.  When the mouse cursor is made visible on the  screen  it 
  2097.       will  be at the row and column position specified in S_MsRow  and 
  2098.       S_MsCol.  If  the values of S_MsRow and S_MsCol would  place  the 
  2099.       mouse  cursor  outside of the current mouse window, the  row  and 
  2100.       column  are adjusted to row 1 and column 1 of the  current  mouse 
  2101.       window.
  2102.       
  2103.       
  2104.        Next  control drops into a loop. Flip ahead in the code and  look 
  2105.       at  the conditions that the loop will end. We see here  that  the 
  2106.       loop  will  end  when the LEFT MOUSE BUTTON is  pressed  and  the 
  2107.       cursor  is  somewhere between columns 1 and 5 on row  11  of  the 
  2108.       screen. 
  2109.       
  2110.       
  2111.       
  2112.       
  2113.                                  Page T-3.32
  2114.       
  2115.       
  2116.       
  2117.       If  you were to plot the locations on the screen you  would  find 
  2118.       that  it  is located in one of the three  highlighted  characters 
  2119.       next to the description for option four "Return to Demo Menu"  of 
  2120.       the mouse demo menu.
  2121.       
  2122.       Now turn back to where control enters the loop.
  2123.       
  2124.       The  first  thing that is done here is the  coordinates  for  the 
  2125.       current mouse window is moved to the screen fields in the  "Mouse 
  2126.       Window"  section, and the "Current Cursor Row   Col"  section  is 
  2127.       updated  with the row and column position of the mouse cursor  as 
  2128.       of the last occurrence of a mouse event.
  2129.       
  2130.       
  2131.       
  2132.       
  2133.       S_ResetMouseFlags
  2134.       ----------------------------------------------------------------
  2135.       There  are  six  mouse button indicators that are  used  so  your 
  2136.       program  can detect which of the mouse buttons have been  pressed 
  2137.       or  released. After you have analyzed their status and  are  done 
  2138.       processing them you must reset them.
  2139.       
  2140.       *** IMPORTANT CONCEPT ***
  2141.       If  you do not call this procedure to reset the button  indicator 
  2142.       status,  they  will  remain  set to TRUE,  or  will  continue  to 
  2143.       indicate  that a button was pressed that really was  not  pressed 
  2144.       during the last mouse event.
  2145.       
  2146.       
  2147.       
  2148.       S_ReadKey
  2149.       ----------------------------------------------------------------
  2150.       This is where the program is now. It has branched into the  Turbo 
  2151.       ScrEdit user interface and is busy scanning the keyboard  waiting 
  2152.       for a key to be pressed or a mouse event to occur.
  2153.       
  2154.       
  2155.       S_MouseEvent (S_Ms->MouseEvent in C) and S_AnalyzeMouse
  2156.       -----------------------------------------------------------------
  2157.       When  a  mouse  event occurs, the  mouse  driver  interrupts  our 
  2158.       program  just as a pop up utility would interrupt  your  program. 
  2159.       For just a fraction of a second, the mouse driver calls a routine 
  2160.       in  the mouse interface and passes it the current status  of  the 
  2161.       mouse.  This routine stores the data passed by the  mouse  driver 
  2162.       and  set  the global variable "S_MouseEvent" to  TRUE.   It  then 
  2163.       returns control to the mouse driver which returns control back to 
  2164.       our  program.  Turbo  ScrEdit  detects that  a  mouse  event  has 
  2165.       occurred  because  S_MouseEvent  now test  TRUE,  so  it  returns 
  2166.       control back to our program just as it does when the ENTER key or 
  2167.       one of the function keys is pressed.
  2168.       
  2169.       Next in our code we see an "IF" statement that is testing to  see 
  2170.       if  a  mouse  event has occurred. If a  event  has  occurred  the 
  2171.       
  2172.       
  2173.       
  2174.       
  2175.       
  2176.       
  2177.       
  2178.       
  2179.                                  Page T-3.33
  2180.       
  2181.       
  2182.       
  2183.       procedure  "S_AnalizeMouse" is called. This routine analyzes  the 
  2184.       data  passed  to our program and sets other global  variables  to 
  2185.       indicate  what buttons were pressed or released, and the  current 
  2186.       row  and  column of the mouse cursor.  The last thing  that  this 
  2187.       routine does is set the "S_MouseEvent" variable to FALSE.
  2188.       
  2189.       *** IMPORTANT CONCEPT ***
  2190.       
  2191.       When  a  mouse event has occurred, you  must  call  S_AnalizeMouse 
  2192.       before  the  next call to S_ReadKey, S_NextKey,  S_ReadScreen,  or 
  2193.       S_ReadField.
  2194.       
  2195.       YOUR PROGRAM WILL GO INTO A INFINITE LOOP IF YOU DO NOT.  
  2196.       
  2197.       ONCE  S_MouseEvent IS SET TO TRUE, ONLY A CALL TO  S_AnalizeMouse 
  2198.       CAN  RESET IT TO FALSE. BECAUSE S_MouseEvent IS SET TO TRUE,  THE 
  2199.       KEYBOARD SCAN ROUTINE WILL THINK THAT A MOUSE EVENT HAS  OCCURRED 
  2200.       SO  IT  WILL NOT STOP AND WAIT FOR A KEY TO BE PRESSED.  IT  WILL 
  2201.       JUST  RETURN  CONTROL TO YOUR PROGRAM. YOUR PROGRAM WILL  NOT  BE 
  2202.       ABLE  TO TELL THAT A MOUSE BUTTON WAS PRESSED BECAUSE  THE  MOUSE 
  2203.       DATA WAS NOT ANALYZED AND MADE AVAILABLE TO YOUR PROGRAM...  SO.. 
  2204.       YOU PROGRAM WILL HANG.
  2205.       
  2206.       
  2207.       
  2208.       
  2209.       Now  that we have discussed the basics on communicating with  the 
  2210.       mouse  lets  take a look at how each of the parts  of  this  demo 
  2211.       works.
  2212.       
  2213.       Move the mouse cursor as far down on the screen as it will move.
  2214.       
  2215.       PRESS THE LEFT MOUSE BUTTON DOWN AND HOLD IT.
  2216.       
  2217.       Notice  in the lower left side of the screen that the  a  message 
  2218.       "*Pressed*"  has appeared beneath the label "Left  Button".  Also 
  2219.       notice  that the "Current Cursor Row and Column" section has  been 
  2220.       updated with the screen coordinates of the cursor when the button 
  2221.       was pressed.
  2222.       
  2223.       RELEASE THE LEFT MOUSE BUTTON
  2224.       
  2225.       Now the message has changed to "*Released*".
  2226.       
  2227.       TRY PRESSING AND RELEASING THE OTHER BUTTONS ON YOUR MOUSE.
  2228.       
  2229.       Next lets look at the logic that causes the pressed and  released 
  2230.       messages to appear on the screen.
  2231.       
  2232.       After control returns from S_ReadKey, the mouse event is analyzed 
  2233.       and our global variables are set to indicate the mouse activity.
  2234.       
  2235.       Next we see the routine "Set_Button_Labels" is performed.  Locate 
  2236.       the routine, it is the first routine in the mouse section of  the 
  2237.       listing.
  2238.       
  2239.       
  2240.       
  2241.       
  2242.       
  2243.       
  2244.       
  2245.                                  Page T-3.34
  2246.       
  2247.       
  2248.       
  2249.       Set_Button_Labels
  2250.       -----------------------------------------------------------------
  2251.       In this routine we see a series of "IF" statements that test  the 
  2252.       status  of the mouse button indicator fields. If the  button  has 
  2253.       been  pressed  the  "*Pressed*" message is moved  to  the  screen 
  2254.       field.  If the button has been released the "*Released*"  message 
  2255.       is  moved  to the screen field. If no activity  occurred  for  the 
  2256.       button the screen field is blanked out. 
  2257.       
  2258.       The  main  thing  that I want you to see here is  how  the  mouse 
  2259.       button status is tested.
  2260.       
  2261.       Next  control  exits this routine and returns to the  mouse  demo 
  2262.       procedure. 
  2263.       
  2264.       Next, as control returns from "Set_Button_Status", we see an "IF" 
  2265.       statement.  We did not press the LEFT MOUSE BUTTON in one of  the 
  2266.       specified  screen  positions  so control advances  to  the  "ELSE" 
  2267.       clause.
  2268.       
  2269.       Again the case statement does not effect us so control returns to 
  2270.       the top of the procedure, screen fields are updated, mouse button 
  2271.       indicators are reset, and control passes back to S_ReadKey.
  2272.       
  2273.       Now turn your attention to the top section of the screen  labeled 
  2274.       the  "Mouse  Event  Handler Set Up". Notice here  that  all  the 
  2275.       mouse  activities that our program seems to detect are  described 
  2276.       in highlighted fields in this section. 
  2277.       
  2278.       Next we will change the events that the mouse driver will monitor 
  2279.       for.
  2280.       
  2281.       MOVE  THE  MOUSE  CURSOR TO THE HIGHLIGHTED 1 NEXT  TO  THE  MENU 
  2282.       OPTION "Modify Event Handler".
  2283.       
  2284.       PRESS THE LEFT MOUSE BUTTON.
  2285.       
  2286.       A  new  label has appear in the top section of  the  screen  that 
  2287.       reads  "** Finished **" and the mouse cursor has been placed   in 
  2288.       the middle of the new field.
  2289.       
  2290.       Lets take a look at the code that just handled what we have done.
  2291.       
  2292.       As control returned from S_ReadKey the mouse event was analyzed.
  2293.       
  2294.       The button status was updated on the screen.
  2295.       
  2296.       The  "IF" statement is still false because our cursor was not  in 
  2297.       the specified areas of the screen so control moves to the  "ELSE" 
  2298.       clause.
  2299.       
  2300.       In  the ELSE clause we see that when the cursor is in rows 5,  7, 
  2301.       or 9 that the routine "Change_Mode" is performed. Our cursor  was 
  2302.       in row 5 so we branch to the routine "Change_Mode".
  2303.       
  2304.       
  2305.       
  2306.       
  2307.       
  2308.       
  2309.       
  2310.       
  2311.                                  Page T-3.35
  2312.       
  2313.       
  2314.       
  2315.       Change_Mode
  2316.       ----------------------------------------------------------------
  2317.       Locate this routine in the source listing.
  2318.       
  2319.       The first two "IF" statements in this routine are skipped because 
  2320.       our  cursor was on row 5 five of the screen when we  clicked  the 
  2321.       left  mouse  button,  so S_MsRow will have a value of 5.  We  see 
  2322.       that we match the criteria described in the third "IF" statement. 
  2323.       
  2324.       Inside  this "IF" statement we see that the field  display  color 
  2325.       attributes  are being changed for field number 5 on  the  screen, 
  2326.       number 4 for C, (Remember Turbo ScrEdit numbers the screen fields 
  2327.       left to right top to bottom). 
  2328.       
  2329.       Next  we  see  the "finished" message is moved  into  the  screen 
  2330.       field.
  2331.       
  2332.       Next we see the current mouse window is changed to the top portion 
  2333.       of the screen.
  2334.       
  2335.       Next  the  Row and Column fields as assigned new values  and  the 
  2336.       mouse cursor is moved into the fields with a call to S_MoveMouse.
  2337.       
  2338.       Control  then exits this procedure  and we see the  mouse  cursor 
  2339.       setting in the "finished" field in the top section of our screen.
  2340.       
  2341.       
  2342.       MOVE  THE  MOUSE  CURSOR  UP  TO  THE  ONLY  LABEL  THAT  IS  NOT 
  2343.       HIGHLIGHTED "Cursor MoveMent" AND PRESS THE LEFT MOUSE BUTTON. 
  2344.       
  2345.       The  "Cursor Movement" label has become highlighted, and  if  you 
  2346.       look at the bit pattern in the lower right section of the  screen 
  2347.       you  will see it has changed. The first character was a 0 and  is 
  2348.       now a 1.
  2349.       
  2350.       Keep  your  eye on the bit pattern as you do the next  few  items 
  2351.       outlined here.
  2352.       
  2353.       MOVE THE CURSOR TO "Left Released" AND PRESS THE LEFT BUTTON.
  2354.       
  2355.       The  "Left  Released"  label changed to normal text  on  a  black 
  2356.       background.  Notice  that the bit patter has changed  again.  The 
  2357.       third character changed from a 1 to a 0.
  2358.       
  2359.       REPEAT THE ABOVE ON EACH OF THE "RELEASED" FIELDS SO ONLY  CURSOR 
  2360.       MOVEMENT AND BUTTON PRESSED LABELS ARE HIGHLIGHTED.
  2361.       
  2362.       MOVE THE MOUSE CURSOR TO THE "FINISHED" LABEL AND PRESS THE  LEFT 
  2363.       MOUSE BUTTON.
  2364.       
  2365.       Now  the mouse cursor has moved back to the 1 in the  first  menu 
  2366.       option.  We can see by the highlighted labels in the top  section 
  2367.       that the mouse driver should now only interrupt our program if the 
  2368.       cursor moves or if one of the buttons is pressed.
  2369.       
  2370.       Lets take a look at the code that just handled what we have done.
  2371.       
  2372.       
  2373.       
  2374.       
  2375.       
  2376.       
  2377.                                  Page T-3.36
  2378.       
  2379.       
  2380.       
  2381.       Each  time we pressed the mouse button on one of  the  activities 
  2382.       described  in the top section of the screen, control passed  down 
  2383.       to the "ELSE" section of the "IF" statement in the main menu code. 
  2384.       This time the current row was in the range specified in the  case 
  2385.       statement  that caused control to branch to the  "Set_Event_Mask" 
  2386.       routine.
  2387.       
  2388.       Set_Event_Mask
  2389.       -----------------------------------------------------------------
  2390.       In  this routine, you will find a "IF" statement for each  of  the 
  2391.       eight  labels in the top portion of the screen. Lets look at  how 
  2392.       the first "IF" statement works.
  2393.       
  2394.       Each of these if statements is performed if the cursor was in the 
  2395.       specified row and columns of the screen when the LEFT BUTTON  was 
  2396.       clicked. 
  2397.       
  2398.       Inside we find another "IF" statement that is testing the  status 
  2399.       of the character in the bit pattern that represents the  function 
  2400.       described in the label where the mouse cursor was. 
  2401.       
  2402.       If  the  bit  pattern character was a '0'  then  the  bit  pattern 
  2403.       character is changed to a '1', or turned on, and the corresponding 
  2404.       field's display color attribute is changed to highlighted.
  2405.       
  2406.       If   the  bit pattern character was a '1' then  the  bit  pattern 
  2407.       character  is  changed  to a '0'  and  the  corresponding  field's 
  2408.       display color is changed to cyan text on a black background.
  2409.       
  2410.       There are eight "IF" statements in this section of code, but only 
  2411.       one of them will be performed each time this routine is called.
  2412.       
  2413.       Control  returns  back  to the main menu section  and  drops  back 
  2414.       around to S_ReadKey.
  2415.       
  2416.       On  the  screen we see the labels change color as  we  click  the 
  2417.       mouse  button  on them, and the bit pattern in  the  lower  right 
  2418.       section  of the screen changes to reflect the activities that  we 
  2419.       select or de-select.
  2420.       
  2421.       Finally, we clicked our mouse button while our cursor was on  the 
  2422.       "finished" label.  Control returned from S_ReadKey and the  mouse 
  2423.       event was analyzed. The button labels were set, and, this  time, 
  2424.       we see that the cursor position satisfies the third condition  of 
  2425.       the  the  main  "IF" statement. So  control  entered  inside  the 
  2426.       statement part of the "IF".
  2427.       
  2428.       Inside  we see that:
  2429.       
  2430.         The  "Mouse Window" is set reset to the mouse menu  portion  of 
  2431.         the screen.
  2432.       
  2433.         Next,  because  S_MsRow  has a value of 3,  the  display  color 
  2434.         attribute for field number 5 (4 for C) is reset to green (2) on 
  2435.         black (0). 
  2436.       
  2437.       
  2438.       
  2439.       
  2440.       
  2441.       
  2442.       
  2443.                                  Page T-3.37
  2444.       
  2445.       
  2446.       
  2447.         Next, the finished field is blanked out.
  2448.       
  2449.         Next,  the bit mask that we see in the lower right hand  corner 
  2450.         of  the  screen  is  used  as  the  argument  to  the  call  to 
  2451.         S_SetMouseEvent.  This call establishes our new  selections  as 
  2452.         the  current mouse activity that the mouse driver will  monitor 
  2453.         for.
  2454.       
  2455.         Next,  the  mouse  is move back to column 3 and  row  5,  which 
  2456.         happens  to be the 1 character in the highlighted area next  to 
  2457.         the "Modify Event Handler" menu option.
  2458.       
  2459.         Control  then zips through the remainder of this  routine  and 
  2460.         falls back to S_ReadKey.
  2461.               
  2462.       
  2463.       
  2464.       Keep your eye on the row and column values in the "Current  Cursor 
  2465.       Row  and Column" section of the screen and move the mouse  cursor 
  2466.       around  on  the screen. As the cursor moves the  row  and  column 
  2467.       values  change.  These  row and column values  can  be  used  for 
  2468.       dragging  windows around on the screen, plotting a  line, etc.
  2469.       
  2470.       PRESS  THE MOUSE BUTTONS AND SEE HOW THE NEW EVENT  HANDLER  ACTS 
  2471.       DIFFERENTLY.
  2472.       
  2473.       This  time  the "*Pressed*" label stays on the screen  until  the 
  2474.       mouse is moved or another key is pressed. The mouse driver is  no 
  2475.       longer interrupting our program when a key is released.
  2476.       
  2477.       Try tracing through the code for options 3 and 4. They are simple 
  2478.       options  that  just show more of changing the  mouse  window  and 
  2479.       positioning the cursor.
  2480.       
  2481.       And  that ends the discussion on using the mouse  interface.  You 
  2482.       should now be armed with enough insite to develop your own  point 
  2483.       and click programs.
  2484.       
  2485.       
  2486.       BE SURE TO READ THE SECTION OF THE MOUSE USER MANUAL ENTITLED  "A 
  2487.       word to the wise about using mouse procedures." on page M-1 of the 
  2488.       programmers  reference  manual. Also experiment  with  the  mouse 
  2489.       demonstration   program "TestMous.C" or "TestMous.Pas"  that  was 
  2490.       included in your Turbo ScrEdit package.
  2491.       
  2492.       Now lets follow the code as we exit the mouse demo and return  to 
  2493.       the main menu.
  2494.       
  2495.       PLACE THE MOUSE CURSOR ON THE 4 IN OPTION 4 OF THE MOUSE MENU AND 
  2496.       CLICK THE LEFT MOUSE BUTTON.
  2497.       
  2498.       In  the code we see that clicking on option 4 ends the main  loop 
  2499.       of  the  mouse  routine so control drop out  and  heads  for  the 
  2500.       routine exit. As it falls through the code see:
  2501.       
  2502.       First, all mouse flags are reset.
  2503.       
  2504.       
  2505.       
  2506.       
  2507.       
  2508.       
  2509.                                  Page T-3.38
  2510.       
  2511.       
  2512.       
  2513.       S_HideMouse
  2514.       -----------------------------------------------------------------
  2515.       This routine makes the mouse cursor invisible on the screen. Even 
  2516.       though the cursor is not on the screen, the mouse driver is still 
  2517.       busy  monitoring the mouse.  Mouse events will still  be  handled 
  2518.       just as when the mouse cursor was visible.
  2519.       
  2520.       
  2521.       
  2522.       
  2523.       S_DisableMouse
  2524.       -----------------------------------------------------------------
  2525.       This  routine  puts  the mouse driver to  sleep.  It  stores  the 
  2526.       current  event  bit  pattern and sends the  mouse  driver  a  bit 
  2527.       pattern  of  "00000000",  which means "don't  monitor  any  mouse 
  2528.       activity.  The  mouse  driver will do nothing  until  a  new  bit 
  2529.       pattern establishes a new activity list.
  2530.       
  2531.       
  2532.       
  2533.       And  finally control returns to the programs main menu.  The  menu 
  2534.       screen  is  reloaded  and  is restored just as  it  was  when  we 
  2535.       branched to the mouse demo routine.
  2536.       
  2537.       
  2538.       
  2539.       
  2540.       
  2541.       Menu Option 3 (Customizing screen colors.).
  2542.       -----------------------------------------------------------------
  2543.       Turbo  ScrEdit now allows you to change any color assignments  to 
  2544.       any   portion   of   the   screen   by   using   the    procedure 
  2545.       S_ChangeScreenColor.  The color assignments for any of the fields 
  2546.       can also be changed by using S_ChangeFieldColor.
  2547.       
  2548.       Before  we  begin take a moment and look  these  two  procedures, 
  2549.       "S_ChangeScreenColor"   and  "S_ChangeFieldColor",  up   in   the 
  2550.       programmers reference manual .  The descriptions there will  give 
  2551.       you a good overview of how these statements work.
  2552.       
  2553.       Now  locate  where menu Option 3 is being processed in  the  main 
  2554.       menu section of the screen.
  2555.       
  2556.       Here  we  see that the screen "Color_Demo" is  being  initialized 
  2557.       by a call to "Initialize_Color_Demo_Buf" each time this option is 
  2558.       performed. 
  2559.       
  2560.       Next we see that the screen "Color_Demo" is loaded and  displayed 
  2561.       on the screen.
  2562.       
  2563.       Next control branches to the procedure "ChangeColors".
  2564.       
  2565.       When control returns from "ChangeColors" the menus screen will be 
  2566.       reloaded and re-displayed.
  2567.       
  2568.       
  2569.       
  2570.       
  2571.       
  2572.       
  2573.       
  2574.       
  2575.                                  Page T-3.39
  2576.       
  2577.       
  2578.       
  2579.       Locate the routine "ChangeColors" in your program listing in  the 
  2580.       section marked:
  2581.       
  2582.            *********************************
  2583.            MENU OPTION 3  (Customizing Screen Colors)
  2584.            Section 4 of Turbo ScrEdit Tutor Part III.
  2585.            *********************************
  2586.       
  2587.       
  2588.       As control enters this routine we see that the screen fields  are 
  2589.       assigned the default values that describe the current colors used 
  2590.       on the screen.
  2591.       
  2592.       Next  we  drop into a "while" loop that will continue  until  the 
  2593.       ESCAPE key is pressed.
  2594.       
  2595.       Next a call to S_ReadScreen is performed.
  2596.       
  2597.       This is where our program is at right now. The cursor is  setting 
  2598.       on the first field in the data entry window  on the line  labeled 
  2599.       "Screen background".
  2600.       
  2601.       Before  we  begin lets take a look at the code and  see  what  is 
  2602.       going to happen when we begin using this demonstration.
  2603.       
  2604.       
  2605.       S_ChangeScreenColors
  2606.       ----------------------------------------------------------------
  2607.       The  next several lines of code that we going to look at  perform 
  2608.       calls  to  S_ChangeScreenColor. Lets look at the meaning  of  the 
  2609.       parameters  being  passed by the first example. It is  using  the 
  2610.       following parameters that mean:
  2611.       
  2612.            0 -                 The  zero  here means change  the  color 
  2613.                                assignments  for all characters  in  the 
  2614.                                specified area of the screen.
  2615.                                 
  2616.                                If you looked this up in the manual  you 
  2617.                                read  that this option can be any  value 
  2618.                                between  0  and 3: 0  means  change  all 
  2619.                                characters,  1 means change only  single 
  2620.                                line  characters,  2  means  change  only 
  2621.                                double  line characters, 3 means  change 
  2622.                                only block line drawing characters.   
  2623.       
  2624.            Color_Demo_Buf.A -  Passes   the  background  color  to   be 
  2625.                                assigned.
  2626.       
  2627.            Color_Demo_Buf.F1 - Passes  the  foreground  color  to   be 
  2628.                                assigned.
  2629.       
  2630.            1, 24, 1,80  -      Specifies  the  "window" of  the  screen 
  2631.                                that  is to be changed in the format  of 
  2632.                                TOP ROW, TOP COLUMN, BOTTOM ROW,  BOTTOM 
  2633.                                COLUMN.
  2634.       
  2635.       
  2636.       
  2637.       
  2638.       
  2639.       
  2640.       
  2641.                                  Page T-3.40
  2642.       
  2643.       
  2644.       
  2645.       You  will  find similar statements in each of the  sections  that 
  2646.       follow  the  section marked "Text".  Notice that the  screen  has 
  2647.       been divided into sections where:
  2648.       
  2649.           Text  
  2650.       
  2651.               Changes every character on the screen.
  2652.       
  2653.           Double  line around logo 
  2654.       
  2655.               Changes  only the double line drawing characters that  it 
  2656.               finds in the to 11 lines of the screen.
  2657.           
  2658.           Logo
  2659.       
  2660.               Changes  only  the double line characters in  the  screen 
  2661.               area that surrounds the word "ScrEdit". 
  2662.       
  2663.           Fill in Logo Letters
  2664.       
  2665.               This  group of statements changes the colors of  all  the 
  2666.               spaces that are embedded in the logo "ScrEdit". 
  2667.       
  2668.           Other logo text
  2669.                
  2670.               This  group of statements updates the  color  assignments 
  2671.               for  "TM", "Turbo", and the text "The Screen  Editor  for 
  2672.               Turbo Pascal Programmers".
  2673.       
  2674.           Copyright Notice
  2675.       
  2676.               Changes the colors of the copyright notice.
  2677.        
  2678.           Version Number
  2679.       
  2680.               Changes the color of the version number.
  2681.       
  2682.           Text in configure box
  2683.       
  2684.               Changes the color of the text inside the single line  box 
  2685.               where we will be keying in new color values.
  2686.       
  2687.           Single line box
  2688.               
  2689.               Changes  the color of the single line box that  surrounds 
  2690.               the text for the data entry section of the screen.
  2691.       
  2692.       
  2693.       
  2694.       S_ChangeFieldColor
  2695.       ----------------------------------------------------------------- 
  2696.       Next we see a loop that will change the prompt and display  color 
  2697.       assignments for the data entry fields on the screen.
  2698.       
  2699.       Lets  take a look at the parameters that are being passed  in  the 
  2700.       
  2701.       
  2702.       
  2703.       
  2704.       
  2705.       
  2706.       
  2707.                                  Page T-3.41
  2708.       
  2709.       
  2710.       
  2711.       first statement:
  2712.       
  2713.           X                  Specifies the number of the field that  is 
  2714.                              to  have  it's color  assignment  changed. 
  2715.                              (Remember  fields  are  numbered  left  to 
  2716.                              right, top to bottom.)
  2717.       
  2718.           1                  Specifies  the  field mode  that  the  new 
  2719.                              color will effect.
  2720.                              0 - Change Normal (empty) display color.
  2721.                              1 - Change Prompt field color.
  2722.                              2 - Change Display color mode.
  2723.                              (Field  color modes are described  in  the 
  2724.                              first part of the tutor.)
  2725.       
  2726.           Color_Demo_Buf.H   Specifies the new foreground color for the 
  2727.                              field mode being changed.
  2728.       
  2729.           Color_Demo_Buf.F8  Specifies the new background color for  the 
  2730.                              field mode being changed.
  2731.       
  2732.       
  2733.       Okay, with that over view let try this option out.
  2734.       
  2735.       TYPE 0 over the 2 in the first field.
  2736.       
  2737.       PRESS TAB
  2738.       
  2739.       TYPE 2 in the background color field.
  2740.       
  2741.       PRESS TAB
  2742.       
  2743.       Type 15 for foreground color on the ScrEdit Logo
  2744.       
  2745.       PRESS ENTER
  2746.       
  2747.       You will notice a brief pause as and the new screen is  displayed 
  2748.       with the changes applied. 
  2749.       
  2750.       S_StoreColorChanges
  2751.       -----------------------------------------------------------------
  2752.       Normally  you  will not want to have your  program  changing  the 
  2753.       screen  colors  as the user is using a screen. Rather,  you  will 
  2754.       want  to  create a "installation" program  or  a  "configuration" 
  2755.       routine  that allows your user to customize the appearance  of  a 
  2756.       screen and then store the changes permanently. 
  2757.       
  2758.       You could make the changes we just performed permanent by coding a 
  2759.       call  to  "S_StoreColorChanges"  at  the  end  of  this  routine. 
  2760.       "S_StoreColorChanges" saves the assignments back into the  screen 
  2761.       library file.
  2762.       
  2763.       
  2764.       That  concludes our discussion of changing the color  assignments 
  2765.       to screens programmatically.
  2766.       
  2767.       Now lets turn back to the main menus section of the program  were 
  2768.       control returns from "ChangeColors".
  2769.       
  2770.       
  2771.       
  2772.       
  2773.                                  Page T-3.42
  2774.       
  2775.       
  2776.       
  2777.       Option 4 and 5
  2778.       ----------------------------------------------------------------
  2779.       Menu  Options 4 and 5 are used to give you a programming  example 
  2780.       of  using  field  validation statements. The  screen  that  these 
  2781.       options  used was thoroughly explained in PART II of  the  tutor. 
  2782.       
  2783.       
  2784.       
  2785.       Option 6
  2786.       ----------------------------------------------------------------
  2787.       This  option  will demonstrate how to use the  message  line  and 
  2788.       S_ReadKey to communicate with the user of your programs.
  2789.       
  2790.       When you select this option a message is displayed that reads:
  2791.         "Press 'C' key to continue".
  2792.       
  2793.       If any other key is pressed the user receives the message:
  2794.         "OOPS!! wrong key - Press 'C' key to continue"
  2795.       
  2796.       The  program will continue prompting for the user to press a  key 
  2797.       until  he types a upper case "C" character and  ScrDemo  displays 
  2798.       the  message:
  2799.         "'C' has been pressed - You may continue."
  2800.       
  2801.       
  2802.       
  2803.       Option 7
  2804.       -----------------------------------------------------------------
  2805.       This option demonstrate mixing your languages standard "write" or 
  2806.       "cprintf" statement to place text on the screen. Notice here that 
  2807.       no  message is displayed on the bottom line of the  screen.  The 
  2808.       procedure  S_NextKey will only accept a key stroke. It  will  not 
  2809.       display any messages.
  2810.       
  2811.       
  2812.       Option 8
  2813.       ----------------------------------------------------------------
  2814.       This  option  demonstrates  how to run a  "son"  process  from  a 
  2815.       program using Turbo ScrEdit. 
  2816.       
  2817.       DemoWind.EXE  is a demonstration program that touches on all  the 
  2818.       features  of using Turbo ScrEdit windows. Turbo  ScrEdit  windows 
  2819.       comes  with  the registered version of Turbo ScrEdit.  However  I 
  2820.       have included the source code for the program DemoWind.Exe so you 
  2821.       can examine the coding required to use windows.
  2822.       
  2823.       
  2824.       
  2825.       Option 9
  2826.       -----------------------------------------------------------------
  2827.       This  procedure  is also easy to follow and demonstrates  how  you 
  2828.       might have your program switch back to using normal video I-O for 
  2829.       your  language, and then switch back to resume  processing  Turbo 
  2830.       ScrEdit's screens.
  2831.       
  2832.       
  2833.       And  that  concludes  the programming portion  of  Turbo  ScrEdit 
  2834.       Tutor.
  2835.       
  2836.       
  2837.       
  2838.       **